@@ -0,0 +1,394 @@
1+{-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI #-}
2+
3+module Reflex.Dom.Xhr.Foreign where
4+
5+import GHCJS.Types
6+import GHCJS.Foreign
7+import GHCJS.Marshal
8+import qualified Data.Text as T
9+import Data.Text (Text)
10+import GHCJS.DOM.Types hiding (Text)
11+import Control.Applicative ((<$>))
12+import GHCJS.DOM.EventM
13+import GHCJS.DOM
14+
15+prepareWebView :: WebView -> IO ()
16+prepareWebView _ = return ()
17+
18+foreign import javascript unsafe "h$isInstanceOf $1 $2"
19+ typeInstanceIsA' :: JSRef a -> JSRef GType -> Bool
20+
21+typeInstanceIsA :: JSRef a -> GType -> Bool
22+typeInstanceIsA o (GType t) = typeInstanceIsA' o t
23+
24+castTo :: (GObjectClass obj, GObjectClass obj') => GType -> String
25+ -> (obj -> obj')
26+castTo gtype objTypeName obj =
27+ case toGObject obj of
28+ gobj@(GObject objRef)
29+ | typeInstanceIsA objRef gtype
30+ -> unsafeCastGObject gobj
31+ | otherwise -> error $ "Cannot cast object to " ++ objTypeName
32+
33+
34+newtype XMLHttpRequest = XMLHttpRequest (JSRef XMLHttpRequest) deriving (Eq)
35+
36+unXMLHttpRequest :: XMLHttpRequest -> JSRef XMLHttpRequest
37+unXMLHttpRequest (XMLHttpRequest o) = o
38+
39+instance ToJSRef XMLHttpRequest where
40+ toJSRef = return . unXMLHttpRequest
41+ {-# INLINE toJSRef #-}
42+
43+instance FromJSRef XMLHttpRequest where
44+ fromJSRef = return . fmap XMLHttpRequest . maybeJSNull
45+ {-# INLINE fromJSRef #-}
46+
47+class GObjectClass o => IsXMLHttpRequest o
48+toXMLHttpRequest :: IsXMLHttpRequest o => o -> XMLHttpRequest
49+toXMLHttpRequest = unsafeCastGObject . toGObject
50+
51+instance IsXMLHttpRequest XMLHttpRequest
52+instance GObjectClass XMLHttpRequest where
53+ toGObject = GObject . castRef . unXMLHttpRequest
54+ unsafeCastGObject = XMLHttpRequest . castRef . unGObject
55+
56+castToXMLHttpRequest :: GObjectClass obj => obj -> XMLHttpRequest
57+castToXMLHttpRequest = castTo gTypeXMLHttpRequest "XMLHttpRequest"
58+
59+foreign import javascript unsafe "window[\"XMLHttpRequest\"]" gTypeXMLHttpRequest' :: JSRef GType
60+gTypeXMLHttpRequest :: GType
61+gTypeXMLHttpRequest = GType gTypeXMLHttpRequest'
62+
63+
64+newtype XMLHttpRequestUpload = XMLHttpRequestUpload (JSRef XMLHttpRequestUpload) deriving (Eq)
65+
66+unXMLHttpRequestUpload :: XMLHttpRequestUpload -> JSRef XMLHttpRequestUpload
67+unXMLHttpRequestUpload (XMLHttpRequestUpload o) = o
68+
69+instance ToJSRef XMLHttpRequestUpload where
70+ toJSRef = return . unXMLHttpRequestUpload
71+ {-# INLINE toJSRef #-}
72+
73+instance FromJSRef XMLHttpRequestUpload where
74+ fromJSRef = return . fmap XMLHttpRequestUpload . maybeJSNull
75+ {-# INLINE fromJSRef #-}
76+
77+class GObjectClass o => IsXMLHttpRequestUpload o
78+toXMLHttpRequestUpload :: IsXMLHttpRequestUpload o => o -> XMLHttpRequestUpload
79+toXMLHttpRequestUpload = unsafeCastGObject . toGObject
80+
81+instance IsXMLHttpRequestUpload XMLHttpRequestUpload
82+instance GObjectClass XMLHttpRequestUpload where
83+ toGObject = GObject . castRef . unXMLHttpRequestUpload
84+ unsafeCastGObject = XMLHttpRequestUpload . castRef . unGObject
85+
86+castToXMLHttpRequestUpload :: GObjectClass obj => obj -> XMLHttpRequestUpload
87+castToXMLHttpRequestUpload = castTo gTypeXMLHttpRequestUpload "XMLHttpRequestUpload"
88+
89+foreign import javascript unsafe "window[\"XMLHttpRequestUpload\"]" gTypeXMLHttpRequestUpload' :: JSRef GType
90+gTypeXMLHttpRequestUpload :: GType
91+gTypeXMLHttpRequestUpload = GType gTypeXMLHttpRequestUpload'
92+
93+foreign import javascript unsafe "new XMLHttpRequest()"
94+ ghcjs_dom_xml_http_request_new ::
95+ IO (JSRef XMLHttpRequest)
96+
97+xmlHttpRequestNew :: a -> IO XMLHttpRequest
98+xmlHttpRequestNew _ = XMLHttpRequest <$> ghcjs_dom_xml_http_request_new
99+
100+foreign import javascript unsafe "$1[\"open\"]($2, $3, $4, $5, $6)"
101+ ghcjs_dom_xml_http_request_open ::
102+ JSRef XMLHttpRequest -> JSString -> JSString -> JSBool -> JSString -> JSString -> IO ()
103+
104+xmlHttpRequestOpen ::
105+ (IsXMLHttpRequest self, ToJSString method, ToJSString url, ToJSString user, ToJSString password) =>
106+ self -> method -> url -> Bool -> user -> password -> IO ()
107+xmlHttpRequestOpen self method url async user password
108+ = ghcjs_dom_xml_http_request_open
109+ (unXMLHttpRequest (toXMLHttpRequest self))
110+ (toJSString method)
111+ (toJSString url)
112+ (toJSBool async)
113+ (toJSString user)
114+ (toJSString password)
115+
116+foreign import javascript unsafe "($2===null)?$1[\"send\"]():$1[\"send\"]($2)"
117+ ghcjs_dom_xml_http_request_send ::
118+ JSRef XMLHttpRequest -> JSString -> IO ()
119+
120+xmlHttpRequestSend ::
121+ (IsXMLHttpRequest self, ToJSString payload) =>
122+ self -> Maybe payload -> IO ()
123+xmlHttpRequestSend self payload
124+ = ghcjs_dom_xml_http_request_send
125+ (unXMLHttpRequest (toXMLHttpRequest self))
126+ (case payload of
127+ Just p -> toJSString p
128+ Nothing -> jsNull)
129+
130+
131+foreign import javascript unsafe "$1[\"setRequestHeader\"]($2, $3)"
132+ ghcjs_dom_xml_http_request_set_request_header ::
133+ JSRef XMLHttpRequest -> JSString -> JSString -> IO ()
134+
135+xmlHttpRequestSetRequestHeader ::
136+ (IsXMLHttpRequest self, ToJSString header, ToJSString value) =>
137+ self -> header -> value -> IO ()
138+xmlHttpRequestSetRequestHeader self header value
139+ = ghcjs_dom_xml_http_request_set_request_header
140+ (unXMLHttpRequest (toXMLHttpRequest self))
141+ (toJSString header)
142+ (toJSString value)
143+
144+foreign import javascript unsafe "$1[\"abort\"]()"
145+ ghcjs_dom_xml_http_request_abort :: JSRef XMLHttpRequest -> IO ()
146+
147+xmlHttpRequestAbort :: (IsXMLHttpRequest self) => self -> IO ()
148+xmlHttpRequestAbort self
149+ = ghcjs_dom_xml_http_request_abort
150+ (unXMLHttpRequest (toXMLHttpRequest self))
151+
152+foreign import javascript unsafe "$1[\"getAllResponseHeaders\"]()"
153+ ghcjs_dom_xml_http_request_get_all_response_headers ::
154+ JSRef XMLHttpRequest -> IO JSString
155+
156+xmlHttpRequestGetAllResponseHeaders ::
157+ (IsXMLHttpRequest self, FromJSString result) =>
158+ self -> IO result
159+xmlHttpRequestGetAllResponseHeaders self
160+ = fromJSString <$>
161+ (ghcjs_dom_xml_http_request_get_all_response_headers
162+ (unXMLHttpRequest (toXMLHttpRequest self)))
163+
164+foreign import javascript unsafe "$1[\"getResponseHeader\"]($2)"
165+ ghcjs_dom_xml_http_request_get_response_header ::
166+ JSRef XMLHttpRequest -> JSString -> IO JSString
167+
168+xmlHttpRequestGetResponseHeader ::
169+ (IsXMLHttpRequest self, ToJSString header, FromJSString result) =>
170+ self -> header -> IO result
171+xmlHttpRequestGetResponseHeader self header
172+ = fromJSString <$>
173+ (ghcjs_dom_xml_http_request_get_response_header
174+ (unXMLHttpRequest (toXMLHttpRequest self))
175+ (toJSString header))
176+
177+foreign import javascript unsafe "$1[\"overrideMimeType\"]($2)"
178+ ghcjs_dom_xml_http_request_override_mime_type ::
179+ JSRef XMLHttpRequest -> JSString -> IO ()
180+
181+xmlHttpRequestOverrideMimeType ::
182+ (IsXMLHttpRequest self, ToJSString override) =>
183+ self -> override -> IO ()
184+xmlHttpRequestOverrideMimeType self override
185+ = ghcjs_dom_xml_http_request_override_mime_type
186+ (unXMLHttpRequest (toXMLHttpRequest self))
187+ (toJSString override)
188+
189+foreign import javascript unsafe
190+ "($1[\"dispatchEvent\"]($2) ? 1 : 0)"
191+ ghcjs_dom_xml_http_request_dispatch_event ::
192+ JSRef XMLHttpRequest -> JSRef Event -> IO Bool
193+
194+xmlHttpRequestDispatchEvent ::
195+ (IsXMLHttpRequest self, IsEvent evt) =>
196+ self -> Maybe evt -> IO Bool
197+xmlHttpRequestDispatchEvent self evt
198+ = ghcjs_dom_xml_http_request_dispatch_event
199+ (unXMLHttpRequest (toXMLHttpRequest self))
200+ (maybe jsNull (unEvent . toEvent) evt)
201+
202+cUNSENT :: Integer
203+cUNSENT = 0
204+
205+cOPENED :: Integer
206+cOPENED = 1
207+
208+cHEADERS_RECEIVED :: Integer
209+cHEADERS_RECEIVED = 2
210+
211+cLOADING :: Integer
212+cLOADING = 3
213+
214+cDONE :: Integer
215+cDONE = 4
216+
217+xmlHttpRequestOnabort ::
218+ (IsXMLHttpRequest self) => Signal self (EventM UIEvent self ())
219+xmlHttpRequestOnabort = (connect "abort")
220+
221+xmlHttpRequestOnerror ::
222+ (IsXMLHttpRequest self) => Signal self (EventM UIEvent self ())
223+xmlHttpRequestOnerror = (connect "error")
224+
225+xmlHttpRequestOnload ::
226+ (IsXMLHttpRequest self) => Signal self (EventM UIEvent self ())
227+xmlHttpRequestOnload = (connect "load")
228+
229+xmlHttpRequestOnloadend ::
230+ (IsXMLHttpRequest self) => Signal self (EventM UIEvent self ())
231+xmlHttpRequestOnloadend = (connect "loadend")
232+
233+xmlHttpRequestOnloadstart ::
234+ (IsXMLHttpRequest self) => Signal self (EventM UIEvent self ())
235+xmlHttpRequestOnloadstart = (connect "loadstart")
236+
237+xmlHttpRequestOnprogress ::
238+ (IsXMLHttpRequest self) => Signal self (EventM UIEvent self ())
239+xmlHttpRequestOnprogress = (connect "progress")
240+
241+xmlHttpRequestOntimeout ::
242+ (IsXMLHttpRequest self) => Signal self (EventM UIEvent self ())
243+xmlHttpRequestOntimeout = (connect "timeout")
244+
245+xmlHttpRequestOnreadystatechange ::
246+ (IsXMLHttpRequest self) => Signal self (EventM UIEvent self ())
247+xmlHttpRequestOnreadystatechange = (connect "readystatechange")
248+
249+foreign import javascript unsafe "$1[\"timeout\"] = $2;"
250+ ghcjs_dom_xml_http_request_set_timeout ::
251+ JSRef XMLHttpRequest -> Word -> IO ()
252+
253+xmlHttpRequestSetTimeout ::
254+ (IsXMLHttpRequest self) => self -> Word -> IO ()
255+xmlHttpRequestSetTimeout self val
256+ = ghcjs_dom_xml_http_request_set_timeout
257+ (unXMLHttpRequest (toXMLHttpRequest self))
258+ val
259+
260+foreign import javascript unsafe "$1[\"timeout\"]"
261+ ghcjs_dom_xml_http_request_get_timeout ::
262+ JSRef XMLHttpRequest -> IO Word
263+
264+xmlHttpRequestGetTimeout ::
265+ (IsXMLHttpRequest self) => self -> IO Word
266+xmlHttpRequestGetTimeout self
267+ = ghcjs_dom_xml_http_request_get_timeout
268+ (unXMLHttpRequest (toXMLHttpRequest self))
269+
270+foreign import javascript unsafe "$1[\"readyState\"]"
271+ ghcjs_dom_xml_http_request_get_ready_state ::
272+ JSRef XMLHttpRequest -> IO Word
273+
274+xmlHttpRequestGetReadyState ::
275+ (IsXMLHttpRequest self) => self -> IO Word
276+xmlHttpRequestGetReadyState self
277+ = ghcjs_dom_xml_http_request_get_ready_state
278+ (unXMLHttpRequest (toXMLHttpRequest self))
279+
280+foreign import javascript unsafe "$1[\"withCredentials\"] = $2;"
281+ ghcjs_dom_xml_http_request_set_with_credentials ::
282+ JSRef XMLHttpRequest -> Bool -> IO ()
283+
284+xmlHttpRequestSetWithCredentials ::
285+ (IsXMLHttpRequest self) => self -> Bool -> IO ()
286+xmlHttpRequestSetWithCredentials self val
287+ = ghcjs_dom_xml_http_request_set_with_credentials
288+ (unXMLHttpRequest (toXMLHttpRequest self))
289+ val
290+
291+foreign import javascript unsafe
292+ "($1[\"withCredentials\"] ? 1 : 0)"
293+ ghcjs_dom_xml_http_request_get_with_credentials ::
294+ JSRef XMLHttpRequest -> IO Bool
295+
296+xmlHttpRequestGetWithCredentials ::
297+ (IsXMLHttpRequest self) => self -> IO Bool
298+xmlHttpRequestGetWithCredentials self
299+ = ghcjs_dom_xml_http_request_get_with_credentials
300+ (unXMLHttpRequest (toXMLHttpRequest self))
301+
302+foreign import javascript unsafe "$1[\"upload\"]"
303+ ghcjs_dom_xml_http_request_get_upload ::
304+ JSRef XMLHttpRequest -> IO (JSRef XMLHttpRequestUpload)
305+
306+xmlHttpRequestGetUpload ::
307+ (IsXMLHttpRequest self) => self -> IO (Maybe XMLHttpRequestUpload)
308+xmlHttpRequestGetUpload self
309+ = fmap XMLHttpRequestUpload . maybeJSNull <$>
310+ (ghcjs_dom_xml_http_request_get_upload
311+ (unXMLHttpRequest (toXMLHttpRequest self)))
312+
313+foreign import javascript unsafe "$1[\"responseText\"]"
314+ ghcjs_dom_xml_http_request_get_response_text ::
315+ JSRef XMLHttpRequest -> IO JSString
316+
317+xmlHttpRequestGetResponseText ::
318+ (IsXMLHttpRequest self, FromJSString result) => self -> IO (Maybe result)
319+xmlHttpRequestGetResponseText self
320+ = fmap fromJSString . maybeJSNull <$>
321+ (ghcjs_dom_xml_http_request_get_response_text
322+ (unXMLHttpRequest (toXMLHttpRequest self)))
323+
324+responseTextToText :: (Maybe JSString) -> Maybe Text
325+responseTextToText r = fmap (T.pack . fromJSString) r
326+
327+foreign import javascript unsafe "$1[\"responseXML\"]"
328+ ghcjs_dom_xml_http_request_get_response_xml ::
329+ JSRef XMLHttpRequest -> IO (JSRef Document)
330+
331+xmlHttpRequestGetResponseXML ::
332+ (IsXMLHttpRequest self) => self -> IO (Maybe Document)
333+xmlHttpRequestGetResponseXML self
334+ = fmap Document . maybeJSNull <$>
335+ (ghcjs_dom_xml_http_request_get_response_xml
336+ (unXMLHttpRequest (toXMLHttpRequest self)))
337+
338+foreign import javascript unsafe "$1[\"responseType\"] = $2;"
339+ ghcjs_dom_xml_http_request_set_response_type ::
340+ JSRef XMLHttpRequest -> JSString -> IO ()
341+
342+xmlHttpRequestSetResponseType ::
343+ (IsXMLHttpRequest self, ToJSString val) => self -> val -> IO ()
344+xmlHttpRequestSetResponseType self val
345+ = ghcjs_dom_xml_http_request_set_response_type
346+ (unXMLHttpRequest (toXMLHttpRequest self))
347+ (toJSString val)
348+
349+toResponseType :: (ToJSString a) => a -> JSString
350+toResponseType = toJSString
351+
352+foreign import javascript unsafe "$1[\"responseType\"]"
353+ ghcjs_dom_xml_http_request_get_response_type ::
354+ JSRef XMLHttpRequest -> IO JSString
355+
356+xmlHttpRequestGetResponseType ::
357+ (IsXMLHttpRequest self, FromJSString result) => self -> IO result
358+xmlHttpRequestGetResponseType self
359+ = fromJSString <$>
360+ (ghcjs_dom_xml_http_request_get_response_type
361+ (unXMLHttpRequest (toXMLHttpRequest self)))
362+
363+foreign import javascript unsafe "$1[\"status\"]"
364+ ghcjs_dom_xml_http_request_get_status ::
365+ JSRef XMLHttpRequest -> IO Word
366+
367+xmlHttpRequestGetStatus ::
368+ (IsXMLHttpRequest self) => self -> IO Word
369+xmlHttpRequestGetStatus self
370+ = ghcjs_dom_xml_http_request_get_status
371+ (unXMLHttpRequest (toXMLHttpRequest self))
372+
373+foreign import javascript unsafe "$1[\"statusText\"]"
374+ ghcjs_dom_xml_http_request_get_status_text ::
375+ JSRef XMLHttpRequest -> IO JSString
376+
377+xmlHttpRequestGetStatusText ::
378+ (IsXMLHttpRequest self, FromJSString result) => self -> IO result
379+xmlHttpRequestGetStatusText self
380+ = fromJSString <$>
381+ (ghcjs_dom_xml_http_request_get_status_text
382+ (unXMLHttpRequest (toXMLHttpRequest self)))
383+
384+foreign import javascript unsafe "$1[\"responseURL\"]"
385+ ghcjs_dom_xml_http_request_get_response_url ::
386+ JSRef XMLHttpRequest -> IO JSString
387+
388+xmlHttpRequestGetResponseURL ::
389+ (IsXMLHttpRequest self, FromJSString result) => self -> IO result
390+xmlHttpRequestGetResponseURL self
391+ = fromJSString <$>
392+ (ghcjs_dom_xml_http_request_get_response_url
393+ (unXMLHttpRequest (toXMLHttpRequest self)))
394+