-- Leo's gemini proxy

-- Connecting to git.thebackupbox.net:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

repo: janusweb
action: commit
revision:
path_from:
revision_from: 17e5de9352e5bbc84bae606cfe6832bf6e896dd0:
path_to:
revision_to:

git.thebackupbox.net

janusweb

git://git.thebackupbox.net/janusweb

commit 17e5de9352e5bbc84bae606cfe6832bf6e896dd0
Author: James Baicoianu <james_github@baicoianu.com>
Date:   Sat Feb 19 15:18:29 2022 -0800

    Don't load avatar iframes unless visible (fix focus stealing)

diff --git a/media/assets/webui/apps/avatar/avatar.js b/media/assets/webui/apps/avatar/avatar.js

index f5bde07bda316829fc1b7f518d19a7aa58017e0c..

index ..39b1e504f4cb627ef508ea32f9eb3371360e2cdd 100644

--- a/media/assets/webui/apps/avatar/avatar.js
+++ b/media/assets/webui/apps/avatar/avatar.js
@@ -67,7 +67,7 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
             <ui-list name="avatar" selectable="1" collection="avatarlist" itemcomponent="janus-avatar-picker-item"></ui-list>
           </ui-tab>
           <ui-tab label="Ready Player Me">
-            <iframe src="https://demo.readyplayer.me/avatar" allow="camera"></iframe>
+            <iframe data-src="https://demo.readyplayer.me/avatar" allow="camera"></iframe>
           </ui-tab>
         </ui-tabs>
       `;
@@ -92,7 +92,7 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba

     // Observer watches for visibility events and hides the 3d avatar preview when the 2d ui disappears
     let threshold = [];
-    for (let i = 0; i < 100; i++) threshold.push(i / 100);
+    for (let i = 0; i < 100; i += 10) threshold.push(i / 100);
     let observer = new IntersectionObserver(ev => this.handleIntersectionChange(ev), { root: document, rootMargin: '0px', threshold: threshold });
     observer.observe(this);
     document.addEventListener('scroll', ev => this.handleScroll(ev));
@@ -106,7 +106,7 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
           <ui-list name="avatar" selectable="1" collection="avatarlist" itemcomponent="janus-avatar-picker-item"></ui-list>
       `;
     } else if (source.type == 'iframe') {
-      tpl = `<iframe src="${source.src}" allow="camera"></iframe>`;
+      tpl = `<iframe data-src="${source.src}" allow="camera"></iframe>`;
     }
     return tpl;
   }
@@ -205,6 +205,21 @@ this.appendChild(this.previewwindow);
     } else if (!this.avatarpreview && intersections[0].isIntersecting) {
       this.showPreview();
     }
+    // If our iframe hasn't been loaded yet, set a timer to load it. Clear the time out if the element becomes hidden before it fires.
+    if (intersections[0].intersectionRatio > 0) {
+      if (this.iframevistimer) {
+        clearTimeout(this.iframevistimer);
+      }
+      this.iframevistimer = setTimeout(() => {
+        let iframe = this.querySelector('iframe[data-src]');
+        if (iframe && iframe.src != iframe.dataset.src) {
+          iframe.src = iframe.dataset.src;
+          delete iframe.dataset.src;
+        }
+      }, 50);
+    } else if (this.iframevistimer) {
+      clearTimeout(this.iframevistimer);
+    }
   }
   handleScroll(ev) {
     this.updatePreviewPosition();

-----END OF PAGE-----

-- Response ended

-- Page fetched on Sun Jun 2 18:14:09 2024