Skip to content

Commit a78e000

Browse files
committed
CLJS-1114: browser REPL script loading race condition
the browser REPL cannot use document.write to load scripts after page load as that would blow away the document. However appending script element to document.body suffers from race conditions due to asynchronous script loading when not using document.write. Add a load queue which enforces sequential load order.
1 parent ffa7a43 commit a78e000

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed

src/cljs/clojure/browser/repl.cljs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@
109109
(js/setTimeout #(send-result connection url (wrap-message :ready "ready")) 50))
110110
(js/alert "No 'xpc' param provided to child iframe.")))
111111

112+
(def load-queue nil)
113+
112114
(defn connect
113115
"Connects to a REPL server from an HTML document. After the
114116
connection is made, the REPL will evaluate forms in the context of
@@ -135,14 +137,28 @@
135137
(set! (.-require__ js/goog) js/goog.require)
136138
;; suppress useless Google Closure error about duplicate provides
137139
(set! (.-isProvided_ js/goog) (fn [name] false))
138-
(set! (.-writeScriptTag_ js/goog)
140+
(set! (.-writeScriptTag__ js/goog)
139141
(fn [src opt_sourceText]
140142
(.appendChild js/document.body
141143
(as-> (.createElement js/document "script") script
142-
(doto script (aset "type" "text/javascript"))
144+
(doto script
145+
(aset "type" "text/javascript")
146+
(aset "onload"
147+
(fn []
148+
(when load-queue
149+
(if (zero? (alength load-queue))
150+
(set! load-queue nil)
151+
(.apply js/goog.writeScriptTag__ nil (.shift load-queue)))))))
143152
(if (nil? opt_sourceText)
144153
(doto script (aset "src" src))
145154
(doto script (gdom/setTextContext opt_sourceText)))))))
155+
(set! (.-writeScriptTag_ js/goog)
156+
(fn [src opt_sourceText]
157+
(if load-queue
158+
(.push load-queue #js [src opt_sourceText])
159+
(do
160+
(set! load-queue #js [])
161+
(js/goog.writeScriptTag__ src opt_sourceText)))))
146162
(set! (.-require js/goog)
147163
(fn [src reload]
148164
(when (= reload "reload-all")

0 commit comments

Comments
 (0)