From 14b52bcb11daca8ea53125bba0134d574d82bf20 Mon Sep 17 00:00:00 2001
From: Christoph Reiter <reiter.christoph@gmail.com>
Date: Wed, 21 Oct 2020 11:19:53 +0200
Subject: [PATCH] Fix a race when starting the scanner multiple times

We would get two scanning loops both scanning for qr codes. This makes
sure only one loop is active at all times.
---
 packages/qr-code-scanner/src/qr-code-scanner.js | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/packages/qr-code-scanner/src/qr-code-scanner.js b/packages/qr-code-scanner/src/qr-code-scanner.js
index 642fef71..d4d79d9b 100644
--- a/packages/qr-code-scanner/src/qr-code-scanner.js
+++ b/packages/qr-code-scanner/src/qr-code-scanner.js
@@ -86,6 +86,7 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
 
         this.clipMask = false;
         this._devices = new Map();
+        this._requestID = null;
     }
 
     static get scopedElements() {
@@ -192,13 +193,20 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
             video.play();
             that.videoRunning = true;
             qrContainer.scrollIntoView({ behavior: 'smooth', block: 'start' });
-            requestAnimationFrame(tick);
+            if (that._requestID !== null) {
+                cancelAnimationFrame(that._requestID);
+                that._requestID = null;
+            }
+            console.assert(that._requestID === null);
+            that._requestID = requestAnimationFrame(tick);
         }).catch((e) => { console.log(e); that.askPermission = true;});
 
         let lastVideoTime = -1;
         let lastCode = null;
 
         function tick() {
+           that._requestID = null;
+
            if (that.sourceChanged) {
                 video.srcObject.getTracks().forEach(function(track) {
                     track.stop();
@@ -340,7 +348,8 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
                 qrContainer.scrollIntoView({ behavior: 'smooth', block: 'start' });
                 scroll = true;
             }
-            requestAnimationFrame(tick);
+            console.assert(that._requestID === null);
+            that._requestID = requestAnimationFrame(tick);
         }
     }
 
-- 
GitLab