|
111 | 111 |
|
112 | 112 | (def load-queue nil)
|
113 | 113 |
|
| 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 | + |
114 | 163 | (defn connect
|
115 | 164 | "Connects to a REPL server from an HTML document. After the
|
116 | 165 | connection is made, the REPL will evaluate forms in the context of
|
|
132 | 181 | (fn [iframe]
|
133 | 182 | (set! (.-display (.-style iframe))
|
134 | 183 | "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) |
176 | 185 | repl-connection))
|
0 commit comments