Skip to content

Commit f0dfb7a

Browse files
committed
CLJS-1115: Reusable repl-bootstrap! fn
lift reusable logic into closure.browser.repl/bootstrap. Handle < IE9.
1 parent a78e000 commit f0dfb7a

File tree

1 file changed

+50
-41
lines changed

1 file changed

+50
-41
lines changed

src/cljs/clojure/browser/repl.cljs

Lines changed: 50 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,55 @@
111111

112112
(def load-queue nil)
113113

114+
(defn bootstrap
115+
"Reusable browser REPL bootstrapping. Patches the essential functions
116+
in goog.base to support re-loading of namespaces after page load."
117+
[]
118+
;; Monkey-patch goog.provide if running under optimizations :none - David
119+
(when-not js/COMPILED
120+
(set! (.-require__ js/goog) js/goog.require)
121+
;; suppress useless Google Closure error about duplicate provides
122+
(set! (.-isProvided_ js/goog) (fn [name] false))
123+
(set! (.-writeScriptTag__ js/goog)
124+
(fn [src opt_sourceText]
125+
(let [loaded (atom false)
126+
onload (fn []
127+
(when (and load-queue (false? @loaded))
128+
(swap! loaded not)
129+
(if (zero? (alength load-queue))
130+
(set! load-queue nil)
131+
(.apply js/goog.writeScriptTag__ nil (.shift load-queue)))))]
132+
(.appendChild js/document.body
133+
(as-> (.createElement js/document "script") script
134+
(doto script
135+
(aset "type" "text/javascript")
136+
(aset "onload" onload)
137+
(aset "onreadystatechange" onload))
138+
(if (nil? opt_sourceText)
139+
(doto script (aset "src" src))
140+
(doto script (gdom/setTextContext opt_sourceText))))))))
141+
(set! (.-writeScriptTag_ js/goog)
142+
(fn [src opt_sourceText]
143+
(if load-queue
144+
(.push load-queue #js [src opt_sourceText])
145+
(do
146+
(set! load-queue #js [])
147+
(js/goog.writeScriptTag__ src opt_sourceText)))))
148+
(set! (.-require js/goog)
149+
(fn [src reload]
150+
(when (= reload "reload-all")
151+
(set! (.-cljsReloadAll_ js/goog) true))
152+
(let [reload? (or reload (.-cljsReloadAll__ js/goog))]
153+
(when reload?
154+
(let [path (aget js/goog.dependencies_.nameToPath src)]
155+
(js-delete js/goog.dependencies_.visited path)
156+
(js-delete js/goog.dependencies_.written
157+
(str js/goog.basePath path))))
158+
(let [ret (.require__ js/goog src)]
159+
(when (= reload "reload-all")
160+
(set! (.-cljsReloadAll_ js/goog) false))
161+
ret))))))
162+
114163
(defn connect
115164
"Connects to a REPL server from an HTML document. After the
116165
connection is made, the REPL will evaluate forms in the context of
@@ -132,45 +181,5 @@
132181
(fn [iframe]
133182
(set! (.-display (.-style iframe))
134183
"none")))
135-
;; Monkey-patch goog.provide if running under optimizations :none - David
136-
(when-not js/COMPILED
137-
(set! (.-require__ js/goog) js/goog.require)
138-
;; suppress useless Google Closure error about duplicate provides
139-
(set! (.-isProvided_ js/goog) (fn [name] false))
140-
(set! (.-writeScriptTag__ js/goog)
141-
(fn [src opt_sourceText]
142-
(.appendChild js/document.body
143-
(as-> (.createElement js/document "script") script
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)))))))
152-
(if (nil? opt_sourceText)
153-
(doto script (aset "src" src))
154-
(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)))))
162-
(set! (.-require js/goog)
163-
(fn [src reload]
164-
(when (= reload "reload-all")
165-
(set! (.-cljsReloadAll_ js/goog) true))
166-
(let [reload? (or reload (.-cljsReloadAll__ js/goog))]
167-
(when reload?
168-
(let [path (aget js/goog.dependencies_.nameToPath src)]
169-
(js-delete js/goog.dependencies_.visited path)
170-
(js-delete js/goog.dependencies_.written
171-
(str js/goog.basePath path))))
172-
(let [ret (.require__ js/goog src)]
173-
(when (= reload "reload-all")
174-
(set! (.-cljsReloadAll_ js/goog) false))
175-
ret)))))
184+
(bootstrap)
176185
repl-connection))

0 commit comments

Comments
 (0)