commit e389e9b78f38367b80c734bcc20f647a846fc0ac
parent c5cba38b08d4c5ee12cf4fe796014d2262dcb08b
Author: tongong <tongong@gmx.net>
Date:   Sun, 29 Nov 2020 09:02:24 +0100
first full implementation
Diffstat:
| M | rama.js |  |  | 56 | +++++++++++++++++++++++++++++++++++++++++++------------- | 
1 file changed, 43 insertions(+), 13 deletions(-)
diff --git a/rama.js b/rama.js
@@ -1,9 +1,11 @@
-// no "let" or "var" here so that pasting updated versions of the code
-// to the developer console does not fire redeclaration-errors
+// no "let" or "var" here so that pasting updated versions of the code to the
+// developer console does not fire redeclaration-errors
 rama = {
     // #################### iframe functions ####################
-    number: 0, // for ids -> no id gets used twice
-    stdparent: document.querySelector("body"), // to globally change this setting
+    // for ids -> no id gets used twice
+    number: 0,
+    // to  make this settig globally changeable
+    stdparent: document.querySelector("body"),
 
     new: function (config) {
         // parse the settings object
@@ -30,19 +32,45 @@ rama = {
         config.parent.appendChild(iframeTag);
 
         // create the rframe object
-        // is this the correct way to create an object? it works...
+        // Is this the correct way to create an object? it works...
         const rframe = {
             tag: iframeTag,
             t: iframeTag,
-            // d & document are added when the page loads (see below)
+            // .d & .document are added when the page loads (see below)
             w: iframeTag.contentWindow,
             window: iframeTag.contentWindow,
             name: config.name,
             id: config.name,
 
-            waitForReload: function () {},
-            waitForUpdate: function () {},
-            waitForSelector: function () {},
+            waitForReload: function () {
+                return new Promise((resolve) => {
+                    iframeTag.addEventListener("load", resolve, { once: true });
+                });
+            },
+            waitFor: function (testFunction, delay) {
+                // - kind of hacky implementation with setInterval() ...
+                // - You could use MutationObservers here but that seems to be
+                //   performance-wise the worse choice
+                // - when MutationObservers aren't used there is actually no
+                //   reason to define this function on this specific object
+                //   rather than global
+                return new Promise((resolve) => {
+                    if (!delay) delay = 500;
+
+                    let interval = window.setInterval(() => {
+                        if (testFunction(rframe)) {
+                            window.clearInterval(interval);
+                            resolve();
+                        }
+                    }, delay);
+                });
+            },
+            waitForSelector: function (selector, delay) {
+                return this.waitFor(
+                    (c) => c.d && !!c.d.querySelector(selector),
+                    delay
+                );
+            },
             close: function () {
                 this.tag.parentElement.removeChild(this.tag);
             }
@@ -60,11 +88,12 @@ rama = {
     },
 
     clearpage: function () {
-        // Not the best practice to put content outside the <body> tag
-        // but it enables us in this case to completely switch to the iframe window
+        // Not the best practice to put content outside the <body> tag but it
+        // enables us in this case to completely switch to the iframe window
         this.stdparent = document.querySelector("html");
         this.loadcss(
-            ".rama-frame { width: 100vw; height: 100vh; position: fixed; top: 0; left: 0; } " +
+            ".rama-frame { width: 100vw; height: 100vh; " +
+                "position: fixed; top: 0; left: 0; } " +
                 "body { display: none; } " +
                 "html { overflow: hidden; } "
         );
@@ -72,7 +101,8 @@ rama = {
 
     // #################### non-iframe functions ####################
     loadjs: function (url) {
-        // modified version of script by Frank Gambino on https://stackoverflow.com/a/39008859
+        // modified version of script by Frank Gambino on
+        // https://stackoverflow.com/a/39008859
         return new Promise((resolve, reject) => {
             let scriptTag = document.createElement("script");
             scriptTag.src = url;