From 19c2cc8689a5e15f3812a4c7bfd0382b0b13b75c Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Mon, 7 Mar 2022 14:54:59 +0100 Subject: [PATCH] Replace XMLHttpRequest usage with the Fetch API in `Driver._send` This is another part in a series of patches that try to re-implement PR 14287 in smaller steps. Besides converting `Driver._send` to use the Fetch API, this also changes the method to return a `Promise` to get rid of the callback function. Please note that I *purposely* try to maintain the existing behaviour of re-sending the data on failure/unexpected response, including how/where the old callback function was invoked. --- test/driver.js | 58 +++++++++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/test/driver.js b/test/driver.js index 2fc3704c2..104391a1a 100644 --- a/test/driver.js +++ b/test/driver.js @@ -19,6 +19,7 @@ const { AnnotationLayer, AnnotationMode, + createPromiseCapability, getDocument, GlobalWorkerOptions, PixelsPerInch, @@ -571,7 +572,7 @@ class Driver { if (!task.pdfDoc) { const dataUrl = this.canvas.toDataURL("image/png"); - this._sendResult(dataUrl, task, failure, () => { + this._sendResult(dataUrl, task, failure).then(() => { this._log( "done" + (failure ? " (failed !: " + failure + ")" : "") + "\n" ); @@ -831,7 +832,7 @@ class Driver { this._log("Snapshotting... "); const dataUrl = this.canvas.toDataURL("image/png"); - this._sendResult(dataUrl, task, failure, () => { + this._sendResult(dataUrl, task, failure).then(() => { this._log( "done" + (failure ? " (failed !: " + failure + ")" : "") + "\n" ); @@ -885,7 +886,7 @@ class Driver { } } - _sendResult(snapshot, task, failure, callback) { + _sendResult(snapshot, task, failure) { const result = JSON.stringify({ browser: this.browser, id: task.id, @@ -901,29 +902,38 @@ class Driver { viewportHeight: task.viewportHeight, outputScale: task.outputScale, }); - this._send("/submit_task_results", result, callback); + return this._send("/submit_task_results", result); } - _send(url, message, callback) { - const r = new XMLHttpRequest(); - r.open("POST", url, true); - r.setRequestHeader("Content-Type", "application/json"); - r.onreadystatechange = e => { - if (r.readyState === 4) { - this.inFlightRequests--; - - // Retry until successful - if (r.status !== 200) { - setTimeout(() => { - this._send(url, message); - }); - } - if (callback) { - callback(); - } - } - }; + _send(url, message) { + const capability = createPromiseCapability(); this.inflight.textContent = this.inFlightRequests++; - r.send(message); + + fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: message, + }) + .then(response => { + // Retry until successful. + if (!response.ok || response.status !== 200) { + throw new Error(response.statusText); + } + + this.inFlightRequests--; + capability.resolve(); + }) + .catch(reason => { + console.warn(`Driver._send failed (${url}): ${reason}`); + + this.inFlightRequests--; + capability.resolve(); + + this._send(url, message); + }); + + return capability.promise; } }