auto-eval

This commit is contained in:
Michiel Borkent 2021-05-27 09:55:01 +02:00
parent 1db46040a3
commit 62b3f1ad5f
3 changed files with 46 additions and 6 deletions

View file

@ -0,0 +1,26 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="css/style.css">
<script src="js/scittle.js" type="application/javascript"></script>
<script>scittle.core.disable_auto_eval()</script>
<!-- to do the same as scittle does by default: -->
<!-- <script>scittle.core.eval_string("(.addEventListener js/document \"DOMContentLoaded\" js/scittle.core.eval_script_tags false)")</script> -->
<script type="application/x-scittle">
(defn my-alert []
(js/alert "You clicked!"))
(set! (.-my_alert js/window) my-alert)
</script>
</head>
<body>
<h1>Scittle</h1>
<p>On this page, auto-eval is disabled.</p>
<p><button onclick="scittle.core.eval_script_tags()">
Click me to evaluate script tags!
</button></p>
<p><button onclick="my_alert()">
Click me to run evaluated function!
</button></p>
</body>
</html>

View file

@ -15,6 +15,9 @@
(fs/copy "resources/public/bookmarklet.html" "gh-pages" (fs/copy "resources/public/bookmarklet.html" "gh-pages"
{:replace-existing true}) {:replace-existing true})
(fs/copy "resources/public/disable_auto_eval.html" "gh-pages"
{:replace-existing true})
(def style-source-dir (fs/file "resources" "public" "css")) (def style-source-dir (fs/file "resources" "public" "css"))
(def style-target-dir (fs/file "gh-pages" "css")) (def style-target-dir (fs/file "gh-pages" "css"))
(fs/create-dirs style-target-dir) (fs/create-dirs style-target-dir)

View file

@ -35,11 +35,11 @@
plug-in-name ;; unused for now plug-in-name ;; unused for now
(swap! ctx sci/merge-opts sci-opts)) (swap! ctx sci/merge-opts sci-opts))
(defn load-contents [script-tags] (defn- eval-script-tags* [script-tags]
(when-let [tag (first script-tags)] (when-let [tag (first script-tags)]
(if-let [text (not-empty (gobject/get tag "textContent"))] (if-let [text (not-empty (gobject/get tag "textContent"))]
(do (eval-string text) (do (eval-string text)
(load-contents (rest script-tags))) (eval-script-tags* (rest script-tags)))
(let [src (.getAttribute tag "src") (let [src (.getAttribute tag "src")
req (js/XMLHttpRequest.) req (js/XMLHttpRequest.)
_ (.open req "GET" src true) _ (.open req "GET" src true)
@ -47,11 +47,22 @@
(fn [] (this-as this (fn [] (this-as this
(let [response (gobject/get this "response")] (let [response (gobject/get this "response")]
(eval-string response)) (eval-string response))
(load-contents (rest script-tags)))))] (eval-script-tags* (rest script-tags)))))]
(.send req))))) (.send req)))))
(defn ^:export eval-script-tags []
(let [script-tags (js/document.querySelectorAll "script[type='application/x-scittle']")]
(eval-script-tags* script-tags)))
(def auto-load-disabled? (volatile! false))
(defn ^:export disable-auto-eval
"By default, scittle evaluates script nodes on the DOMContentLoaded
event using the eval-script-tags function. This function disables
that behavior."
[]
(vreset! auto-load-disabled? true))
(js/document.addEventListener (js/document.addEventListener
"DOMContentLoaded" "DOMContentLoaded"
(fn [] (fn [] (when-not @auto-load-disabled? (eval-script-tags))), false)
(let [script-tags (js/document.querySelectorAll "script[type='application/x-scittle']")]
(load-contents script-tags))), false)