Add WebSocket perf tests.

This CL adds a websocket performance test where client receives arrayuffer of 1 mega bytes 100 times.

Test:
$ cd third_party/blink/perf_tests/websocket
$ npm install
$ npm start
$ python ../../../../tools/perf/run_benchmark run blink_perf --browser=canary --test-path=websocket\receive-arraybuffer-1MBx100.html
or open the file directly on browser.

Rough result (avg ms of 6 runs) on Windows10, 28-core CPU of 2.6GHz:
  Chrome Canary(m75): 1709
  Canary w/o extension: 637
  FireFox: 338

Bug: 954000
Change-Id: Ica622aba18d57af2c97f11019588762544008d6d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1573436
Reviewed-by: Yutaka Hirano <yhirano@chromium.org>
Reviewed-by: Hayato Ito <hayato@chromium.org>
Reviewed-by: Adam Rice <ricea@chromium.org>
Commit-Queue: Yoichi Osato <yoichio@chromium.org>
Cr-Commit-Position: refs/heads/master@{#653497}
diff --git a/third_party/blink/perf_tests/websocket/.gitignore b/third_party/blink/perf_tests/websocket/.gitignore
new file mode 100644
index 0000000..b512c09d
--- /dev/null
+++ b/third_party/blink/perf_tests/websocket/.gitignore
@@ -0,0 +1 @@
+node_modules
\ No newline at end of file
diff --git a/third_party/blink/perf_tests/websocket/package-lock.json b/third_party/blink/perf_tests/websocket/package-lock.json
new file mode 100644
index 0000000..b2bce12
--- /dev/null
+++ b/third_party/blink/perf_tests/websocket/package-lock.json
@@ -0,0 +1,21 @@
+{
+  "name": "ws-speed-test",
+  "version": "0.1.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "async-limiter": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+      "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
+    },
+    "ws": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
+      "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
+      "requires": {
+        "async-limiter": "~1.0.0"
+      }
+    }
+  }
+}
diff --git a/third_party/blink/perf_tests/websocket/package.json b/third_party/blink/perf_tests/websocket/package.json
new file mode 100644
index 0000000..8bc2e39a
--- /dev/null
+++ b/third_party/blink/perf_tests/websocket/package.json
@@ -0,0 +1,7 @@
+{
+  "name": "ws-speed-test",
+  "version": "0.1.0",
+  "dependencies": {
+    "ws": "^5.2.2"
+  }
+}
diff --git a/third_party/blink/perf_tests/websocket/receive-arraybuffer-1MBx100.html b/third_party/blink/perf_tests/websocket/receive-arraybuffer-1MBx100.html
new file mode 100644
index 0000000..3641c5c
--- /dev/null
+++ b/third_party/blink/perf_tests/websocket/receive-arraybuffer-1MBx100.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="../resources/runner.js"></script>
+</head>
+<body>
+<script>
+// To run this perf test, you need to run the web socket server:
+// $ cd third_party/blink/perf_tests/websocket
+// $ npm install
+// $ npm start
+// $ python ../../../../tools/perf/run_benchmark run blink_perf --browser=canary --test-path=websocket\receive-arraybuffer-1MBx100.html
+
+async function runTestCase() {
+  const ws = new WebSocket("ws://127.0.0.1:8001/");
+  ws.binaryType = "arraybuffer";
+  const onOpen = new Promise(resolve => {
+    ws.onopen = () => {
+      PerfTestRunner.addRunTestStartMarker();
+      resolve(PerfTestRunner.now());
+    };
+  });
+  const onClose = new Promise(resolve => {
+    ws.onclose = () => {
+      PerfTestRunner.addRunTestEndMarker();
+      resolve(PerfTestRunner.now());
+    }
+  });
+  const [openTime, closeTime] = await Promise.all([onOpen, onClose]);
+  PerfTestRunner.measureValueAsync(closeTime - openTime);
+}
+
+let isDone = false;
+PerfTestRunner.startMeasureValuesAsync({
+  description: "Measure performance of receiving 1MB array 100 times.",
+  unit: 'ms',
+  done: function () {
+    isDone = true;
+  },
+  run: async function() {
+    while (!isDone) await runTestCase();
+  },
+  iterationCount: 6,
+});
+</script>
+</body>
+</html>
diff --git a/third_party/blink/perf_tests/websocket/server.js b/third_party/blink/perf_tests/websocket/server.js
new file mode 100644
index 0000000..75caac5
--- /dev/null
+++ b/third_party/blink/perf_tests/websocket/server.js
@@ -0,0 +1,18 @@
+const ws = require('ws')
+const ws_server = new ws.Server({ host: '0.0.0.0', port: 8001 });
+const getNow = () => {
+  const date = new Date();
+  return date.toLocaleTimeString() + "." + date.getMilliseconds();
+};
+console.log(getNow() + " WebSocket server started.");
+const arrayBuf = 1000*1000; // 1MB
+const totalIter = 100;
+ws_server.on('connection', function(ws_socket) {
+  console.log(getNow() + " Connection established.");
+  const data = new ArrayBuffer(arrayBuf);
+  for (let i = 0; i < totalIter; i++) {
+    ws_socket.send(data, {binary: true});
+  }
+  ws_socket.close();
+  console.log(getNow() + " Connection closed.");
+});
\ No newline at end of file