MDL-69360 behat: Fix js ready checks for non-moodle sites
authorNoel De Martin <noel@moodle.com>
Tue, 25 Aug 2020 07:48:20 +0000 (09:48 +0200)
committerNoel De Martin <noel@moodle.com>
Wed, 2 Sep 2020 08:20:52 +0000 (10:20 +0200)
lib/behat/behat_base.php

index b36272b..ce2ae0b 100644 (file)
@@ -91,8 +91,12 @@ class behat_base extends Behat\MinkExtension\Context\RawMinkContext {
 
     /**
      * The JS code to check that the page is ready.
+     *
+     * The document must be complete and either M.util.pending_js must be empty, or it must not be defined at all.
      */
-    const PAGE_READY_JS = '(typeof M !== "undefined" && M.util && M.util.pending_js && !Boolean(M.util.pending_js.length)) && (document.readyState === "complete")';
+    const PAGE_READY_JS = "document.readyState === 'complete' && " .
+        "(typeof M !== 'object' || typeof M.util !== 'object' || " .
+        "typeof M.util.pending_js === 'undefined' || M.util.pending_js.length === 0)";
 
     /**
      * Locates url, based on provided path.
@@ -818,19 +822,15 @@ EOF;
             try {
                 $jscode = trim(preg_replace('/\s+/', ' ', '
                     return (function() {
-                        if (typeof M === "undefined") {
-                            if (document.readyState === "complete") {
-                                return "";
-                            } else {
-                                return "incomplete";
-                            }
-                        } else if (' . self::PAGE_READY_JS . ') {
+                        if (document.readyState !== "complete") {
+                            return "incomplete";
+                        }
+
+                        if (typeof M !== "object" || typeof M.util !== "object" || typeof M.util.pending_js === "undefined") {
                             return "";
-                        } else if (typeof M.util !== "undefined") {
-                            return M.util.pending_js.join(":");
-                        } else {
-                            return "incomplete"
                         }
+
+                        return M.util.pending_js.join(":");
                     })()'));
                 $pending = self::evaluate_script_in_session($session, $jscode);
             } catch (NoSuchWindow $nsw) {