on develop help sign in
Merge branch 'xhr-response-types' into fix-dyn-pattern-match

# Conflicts: # default.nix # reflex-dom.cabal # src-ghc/Reflex/Dom/Internal/Foreign.hs # src-ghc/Reflex/Dom/Xhr/Foreign.hs # src-ghcjs/Reflex/Dom/Internal/Foreign.hs # src-ghcjs/Reflex/Dom/WebSocket/Foreign.hs # src-ghcjs/Reflex/Dom/Xhr/Foreign.hs # src/Reflex/Dom/Class.hs # src/Reflex/Dom/Internal.hs # src/Reflex/Dom/Time.hs # src/Reflex/Dom/Widget/Basic.hs # src/Reflex/Dom/Xhr.hs # src/Reflex/Dom/Xhr/ResponseType.hs

commit697965590f024448b0e5bee68d67cc2d92003ba5 authorAli Abrar <aliabrar@gmail.com> dateSat 6 Feb 2016, 14:41 (11 years ago) parent060b39c5e2cbe7
11 files changed+155−72
default.nix+1−1 reflex-dom.cabal+1−1 src-ghc/Reflex/Dom/Internal/Foreign.hs+38−9 src-ghc/Reflex/Dom/WebSocket/Foreign.hs+1−3 src-ghc/Reflex/Dom/Xhr/Foreign.hs+41−34 src-ghcjs/Reflex/Dom/Internal/Foreign.hs+21 src-ghcjs/Reflex/Dom/WebSocket/Foreign.hs+2−5 src-ghcjs/Reflex/Dom/Xhr/Foreign.hs+28−15 src/Reflex/Dom/Widget/Basic.hs+7−1 src/Reflex/Dom/Xhr.hs+6−1 src/Reflex/Dom/Xhr/ResponseType.hs+9−2
default.nix+1−1
@@ -30,6 +30,6 @@ mkDerivation {
3030 zenc
3131 random
3232 ] ++ (if (ghc.pname or null) == "ghcjs" then [ ] else [ webkitgtk3-javascriptcore raw-strings-qq ]);
33− pkgconfigDepends = if (ghc.pname or null) == "ghcjs" then [ ] else [ webkitgtk24x ];
33+ pkgconfigDepends = if (ghc.pname or null) == "ghcjs" then [ ] else [ webkitgtk24x webkitgtk3-javascriptcore raw-strings-qq ];
3434 license = null;
3535}
reflex-dom.cabal+1−1
@@ -39,7 +39,7 @@ library
3939 text == 1.2.*,
4040 bytestring == 0.10.*,
4141 data-default == 0.5.*,
42− aeson >= 0.8 && < 0.10,
42+ aeson >= 0.8 && < 0.11,
4343 time == 1.4.* || == 1.5.*,
4444 exception-transformers == 0.4.*,
4545 directory == 1.2.*,
src-ghc/Reflex/Dom/Internal/Foreign.hs+38−9
@@ -1,11 +1,16 @@
11{-# LANGUAGE CPP, ForeignFunctionInterface, ScopedTypeVariables, LambdaCase #-}
22module Reflex.Dom.Internal.Foreign where
33
4−import Control.Lens hiding (set)
5−import GHCJS.DOM hiding (runWebGUI)
64import Control.Concurrent
5+import Control.Exception (bracket)
6+import Control.Lens hiding (set)
7+import Control.Monad
78import Control.Monad.State.Strict hiding (mapM, mapM_, forM, forM_, sequence, sequence_, get)
9+import Data.ByteString (ByteString)
10+import Data.List
11+import Foreign.Marshal hiding (void)
812import Foreign.Ptr
13+import GHCJS.DOM hiding (runWebGUI)
914import GHCJS.DOM.Navigator
1015import GHCJS.DOM.Window
1116import Graphics.UI.Gtk hiding (Widget)
@@ -14,14 +19,14 @@ import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
1419import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSStringRef
1520import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
1621import Graphics.UI.Gtk.WebKit.JavaScriptCore.WebFrame
17−import Graphics.UI.Gtk.WebKit.WebView
1822import Graphics.UI.Gtk.WebKit.Types hiding (Event, Widget)
19−import Graphics.UI.Gtk.WebKit.WebSettings
2023import Graphics.UI.Gtk.WebKit.WebFrame
2124import Graphics.UI.Gtk.WebKit.WebInspector
22−import Data.List
25+import Graphics.UI.Gtk.WebKit.WebSettings
26+import Graphics.UI.Gtk.WebKit.WebView
2327import System.Directory
2428import System.Glib.FFI hiding (void)
29+import qualified Data.ByteString as BS
2530
2631#ifndef mingw32_HOST_OS
2732import System.Posix.Signals
@@ -117,18 +122,42 @@ fromJSStringMaybe c t = do
117122 return $ Just s
118123
119124getLocationHost :: WebView -> IO String
120−getLocationHost wv = do
121− c <- webFrameGetGlobalContext =<< webViewGetMainFrame wv
125+getLocationHost wv = withWebViewContext wv $ \c -> do
122126 script <- jsstringcreatewithutf8cstring "location.host"
123127 lh <- jsevaluatescript c script nullPtr nullPtr 1 nullPtr
124128 lh' <- fromJSStringMaybe c lh
125129 return $ maybe "" id lh'
126130
127131getLocationProtocol :: WebView -> IO String
128−getLocationProtocol wv = do
129− c <- webFrameGetGlobalContext =<< webViewGetMainFrame wv
132+getLocationProtocol wv = withWebViewContext wv $ \c -> do
130133 script <- jsstringcreatewithutf8cstring "location.protocol"
131134 lp <- jsevaluatescript c script nullPtr nullPtr 1 nullPtr
132135 lp' <- fromJSStringMaybe c lp
133136 return $ maybe "" id lp'
134137
138+bsToArrayBuffer :: JSContextRef -> ByteString -> IO JSValueRef
139+bsToArrayBuffer c bs = do
140+ elems <- forM (BS.unpack bs) $ \x -> jsvaluemakenumber c $ fromIntegral x
141+ let numElems = length elems
142+ bracket (mallocArray numElems) free $ \elemsArr -> do
143+ pokeArray elemsArr elems
144+ a <- jsobjectmakearray c (fromIntegral numElems) elemsArr nullPtr
145+ newUint8Array <- jsstringcreatewithutf8cstring "new Uint8Array(this)"
146+ jsevaluatescript c newUint8Array a nullPtr 1 nullPtr
147+
148+bsFromArrayBuffer :: JSContextRef -> JSValueRef -> IO ByteString
149+bsFromArrayBuffer c a = do
150+ let getIntegral = fmap round . (\x -> jsvaluetonumber c x nullPtr)
151+ getByteLength <- jsstringcreatewithutf8cstring "this.byteLength"
152+ byteLength <- getIntegral =<< jsevaluatescript c getByteLength a nullPtr 1 nullPtr
153+ toUint8Array <- jsstringcreatewithutf8cstring "new Uint8Array(this)"
154+ uint8Array <- jsevaluatescript c toUint8Array a nullPtr 1 nullPtr
155+ getIx <- jsstringcreatewithutf8cstring "this[0][this[1]]"
156+ let arrayLookup i = do
157+ i' <- jsvaluemakenumber c (fromIntegral i)
158+ args <- toJSObject c [uint8Array, i']
159+ getIntegral =<< jsevaluatescript c getIx args nullPtr 1 nullPtr
160+ fmap BS.pack $ forM [0..byteLength-1] arrayLookup
161+
162+withWebViewContext :: WebView -> (JSContextRef -> IO a) -> IO a
163+withWebViewContext wv f = f =<< webFrameGetGlobalContext =<< webViewGetMainFrame wv
src-ghc/Reflex/Dom/WebSocket/Foreign.hs+1−3
@@ -15,7 +15,6 @@ import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
1515import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
1616import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSStringRef
1717import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
18−import Graphics.UI.Gtk.WebKit.JavaScriptCore.WebFrame
1918import Graphics.UI.Gtk.WebKit.WebView
2019import qualified Data.ByteString as BS
2120import qualified Data.Text as T
@@ -27,8 +26,7 @@ data JSWebSocket = JSWebSocket { wsValue :: JSValueRef
2726 }
2827
2928newWebSocket :: WebView -> String -> (ByteString -> IO ()) -> IO () -> IO () -> IO JSWebSocket
30−newWebSocket wv url onMessage onOpen onClose = do
31− c <- webFrameGetGlobalContext =<< webViewGetMainFrame wv
29+newWebSocket wv url onMessage onOpen onClose = withWebViewContext wv $ \c -> do
3230 url' <- jsvaluemakestring c =<< jsstringcreatewithutf8cstring url
3331 newWSArgs <- toJSObject c [url']
3432 newWS <- jsstringcreatewithutf8cstring "(function(that) { var ws = new WebSocket(that[0]); ws['binaryType'] = 'arraybuffer'; return ws; })(this)"
src-ghc/Reflex/Dom/Xhr/Foreign.hs+41−34
@@ -3,6 +3,7 @@ module Reflex.Dom.Xhr.Foreign ( module Reflex.Dom.Xhr.Foreign
33 , XhrResponseType
44 ) where
55
6+import Control.Monad
67import qualified Data.Text as T
78import Data.Text (Text)
89import System.Glib.FFI
@@ -17,6 +18,7 @@ import Reflex.Dom.Xhr.ResponseType
1718import Reflex.Dom.Xhr.Exception
1819import Control.Concurrent.MVar
1920import Control.Exception.Base
21+import Graphics.UI.Gtk.WebKit.Types hiding (Text)
2022
2123import Reflex.Dom.Internal.Foreign
2224
@@ -28,23 +30,36 @@ data XMLHttpRequest
2830 }
2931 deriving (Eq, Ord)
3032
31−data XhrResponseBody = XhrResponseBody { unXhrResponseBody :: JSValueRef }
33+class IsXhrPayload a where
34+ xmlHttpRequestSend :: XMLHttpRequest -> a -> IO ()
35+
36+instance IsXhrPayload () where
37+ xmlHttpRequestSend xhr _ = xmlHttpRequestSendPayload xhr Nothing
38+
39+instance IsXhrPayload String where
40+ xmlHttpRequestSend xhr = xmlHttpRequestSendPayload xhr . Just
41+
42+instance IsXhrPayload File where
43+ xmlHttpRequestSend = error "xmlHttpRequestSend{File}: not implemented"
3244
3345stringToJSValue :: JSContextRef -> String -> IO JSValueRef
3446stringToJSValue ctx s = jsvaluemakestring ctx =<< jsstringcreatewithutf8cstring s
3547
36−toResponseType :: XhrResponseType -> String
37−toResponseType XhrResponseType_Default = ""
38−toResponseType XhrResponseType_ArrayBuffer = "arraybuffer"
39−toResponseType XhrResponseType_Blob = "blob"
40−toResponseType XhrResponseType_Document = "document"
41−toResponseType XhrResponseType_JSON = "json"
42−toResponseType XhrResponseType_Text = "text"
48+fromResponseType :: XhrResponseType -> String
49+fromResponseType XhrResponseType_Default = ""
50+fromResponseType XhrResponseType_ArrayBuffer = "arraybuffer"
51+fromResponseType XhrResponseType_Blob = "blob"
52+fromResponseType XhrResponseType_Text = "text"
53+
54+toResponseType :: String -> Maybe XhrResponseType
55+toResponseType "" = Just XhrResponseType_Default
56+toResponseType "arraybuffer" = Just XhrResponseType_ArrayBuffer
57+toResponseType "blob" = Just XhrResponseType_Blob
58+toResponseType "text" = Just XhrResponseType_Text
59+toResponseType _ = Nothing
4360
4461xmlHttpRequestNew :: WebView -> IO XMLHttpRequest
45−xmlHttpRequestNew wv = do
46− wf <- webViewGetMainFrame wv
47− jsContext <- webFrameGetGlobalContext wf
62+xmlHttpRequestNew wv = withWebViewContext wv $ \jsContext -> do
4863 xhrScript <- jsstringcreatewithutf8cstring "new XMLHttpRequest()"
4964 xhr' <- jsevaluatescript jsContext xhrScript nullPtr nullPtr 1 nullPtr
5065 jsvalueprotect jsContext xhr'
@@ -83,43 +98,35 @@ xmlHttpRequestGetReadyState xhr = do
8398 d <- jsvaluetonumber c rs nullPtr
8499 return $ truncate d
85100
101+xmlHttpRequestGetResponseType :: XMLHttpRequest -> IO (Maybe XhrResponseType)
102+xmlHttpRequestGetResponseType xhr = do
103+ script <- jsstringcreatewithutf8cstring "this.responseType"
104+ rt <- jsevaluatescript (xhrContext xhr) script (xhrValue xhr) nullPtr 1 nullPtr
105+ ms <- fromJSStringMaybe (xhrContext xhr) rt
106+ return $ join $ fmap toResponseType ms
107+
86108xmlHttpRequestGetResponse :: XMLHttpRequest -> IO (Maybe XhrResponseBody)
87109xmlHttpRequestGetResponse xhr = do
88110 let c = xhrContext xhr
111+ mrt <- xmlHttpRequestGetResponseType xhr
89112 script <- jsstringcreatewithutf8cstring "this.response"
90113 t <- jsevaluatescript c script (xhrValue xhr) nullPtr 1 nullPtr
91114 isNull <- jsvalueisnull c t
92115 case isNull of
93116 True -> return Nothing
94− False -> return $ Just $ XhrResponseBody t
117+ False -> case mrt of
118+ Just XhrResponseType_ArrayBuffer -> Just . XhrResponseBody_ArrayBuffer <$> bsFromArrayBuffer c t
119+ Just XhrResponseType_Blob -> Just . XhrResponseBody_Blob . Blob . castForeignPtr <$> newForeignPtr_ t
120+ Just XhrResponseType_Default -> fmap (XhrResponseBody_Default . T.pack) <$> fromJSStringMaybe c t
121+ Just XhrResponseType_Text -> fmap (XhrResponseBody_Text . T.pack) <$> fromJSStringMaybe c t
122+ _ -> return Nothing
95123
96124xmlHttpRequestGetResponseText :: XMLHttpRequest -> IO (Maybe Text)
97125xmlHttpRequestGetResponseText xhr = do
98126 let c = xhrContext xhr
99127 script <- jsstringcreatewithutf8cstring "this.responseText"
100128 t <- jsevaluatescript c script (xhrValue xhr) nullPtr 1 nullPtr
101− isNull <- jsvalueisnull c t
102− case isNull of
103− True -> return Nothing
104− False -> do
105− j <- jsvaluetostringcopy c t nullPtr
106− l <- jsstringgetmaximumutf8cstringsize j
107− s <- allocaBytes (fromIntegral l) $ \ps -> do
108− _ <- jsstringgetutf8cstring'_ j ps (fromIntegral l)
109− peekCString ps
110− return $ Just $ T.pack s
111−
112−class IsXhrPayload a where
113− xmlHttpRequestSend :: XMLHttpRequest -> a -> IO ()
114−
115−instance IsXhrPayload () where
116− xmlHttpRequestSend xhr _ = xmlHttpRequestSendPayload xhr Nothing
117−
118−instance IsXhrPayload String where
119− xmlHttpRequestSend xhr = xmlHttpRequestSendPayload xhr . Just
120−
121−instance IsXhrPayload File where
122− xmlHttpRequestSend = error "xmlHttpRequestSend{File}: not implemented"
129+ fmap (fmap T.pack) $ fromJSStringMaybe c t
123130
124131xmlHttpRequestSendPayload :: XMLHttpRequest -> Maybe String -> IO ()
125132xmlHttpRequestSendPayload xhr payload = do
src-ghcjs/Reflex/Dom/Internal/Foreign.hs+21
@@ -4,9 +4,16 @@ module Reflex.Dom.Internal.Foreign ( module Reflex.Dom.Internal.Foreign
44 ) where
55
66import Control.Monad
7+import Data.ByteString (ByteString)
8+import Foreign
9+import Foreign.C
710import GHCJS.DOM
811import GHCJS.DOM.Types
912import GHCJS.Types
13+import JavaScript.TypedArray.ArrayBuffer as JS
14+import qualified Data.ByteString as BS
15+import qualified GHCJS.Buffer as JS
16+import qualified GHCJS.Marshal.Pure as JS
1017
1118quitWebView :: WebView -> IO ()
1219quitWebView = error "quitWebView: unimplemented in GHCJS"
@@ -20,3 +27,17 @@ foreign import javascript unsafe "location['protocol']" getLocationProtocol_ ::
2027
2128getLocationProtocol :: FromJSString r => a -> IO r
2229getLocationProtocol _ = liftM fromJSString getLocationProtocol_
30+
31+withWebViewContext :: a -> (a -> IO b) -> IO b
32+withWebViewContext a f = f a
33+
34+foreign import javascript safe "new DataView($3,$1,$2)" js_dataView :: Int -> Int -> JSVal -> JSVal
35+
36+foreign import javascript unsafe "new Uint8Array($1_1['buf'], $1_2, $2)['buffer']" extractByteArray :: Ptr CChar -> Int -> IO JSVal
37+
38+bsToArrayBuffer :: a -> ByteString -> IO JSVal
39+bsToArrayBuffer _ bs = BS.useAsCString bs $ \cStr -> do
40+ extractByteArray cStr $ BS.length bs
41+
42+bsFromArrayBuffer :: a -> JSVal -> IO ByteString
43+bsFromArrayBuffer _ ab = liftM (JS.toByteString 0 Nothing . JS.createFromArrayBuffer) $ JS.unsafeFreeze $ JS.pFromJSVal ab
src-ghcjs/Reflex/Dom/WebSocket/Foreign.hs+2−5
@@ -30,11 +30,8 @@ newWebSocket _ url onMessage onOpen onClose = do
3030 _ <- on ws message $ do
3131 e <- ask
3232 d <- getData e
33− liftIO $ case jsTypeOf d of
34− String -> onMessage $ encodeUtf8 $ pFromJSVal d
35− _ -> do
36− ab <- unsafeFreeze $ pFromJSVal d
37− onMessage $ toByteString 0 Nothing $ createFromArrayBuffer ab
33+ ab <- liftIO $ unsafeFreeze $ pFromJSVal d
34+ liftIO $ onMessage $ toByteString 0 Nothing $ createFromArrayBuffer ab
3835 _ <- on ws closeEvent $ liftIO onClose
3936 return $ JSWebSocket ws
4037
src-ghcjs/Reflex/Dom/Xhr/Foreign.hs+28−15
@@ -1,4 +1,4 @@
1−{-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI, OverloadedStrings, FlexibleInstances #-}
1+{-# LANGUAGE FlexibleInstances, TypeSynonymInstances, ForeignFunctionInterface, JavaScriptFFI, OverloadedStrings #-}
22
33module Reflex.Dom.Xhr.Foreign (
44 XMLHttpRequest
@@ -9,18 +9,17 @@ module Reflex.Dom.Xhr.Foreign (
99import Prelude hiding (error)
1010import Data.Text (Text)
1111import GHCJS.DOM.Types hiding (Text)
12−import GHCJS.DOM.EventM
1312import GHCJS.DOM
1413import GHCJS.DOM.Enums
1514import GHCJS.DOM.XMLHttpRequest
1615import Data.Maybe (fromMaybe)
1716import GHCJS.DOM.EventTarget (dispatchEvent)
18−import GHCJS.Types
17+import GHCJS.DOM.EventM (EventM, on)
18+import Reflex.Dom.Internal.Foreign
1919import Reflex.Dom.Xhr.Exception
2020import Reflex.Dom.Xhr.ResponseType
2121import Control.Exception (catch, throwIO)
22−
23−data XhrResponseBody = XhrResponseBody { unXhrResponseBody :: JSVal }
22+import GHCJS.Types
2423
2524prepareWebView :: WebView -> IO ()
2625prepareWebView _ = return ()
@@ -62,6 +61,7 @@ newtype XhrPayload = XhrPayload { unXhrPayload :: JSVal }
6261xmlHttpRequestSend :: IsXhrPayload payload => XMLHttpRequest -> payload -> IO ()
6362xmlHttpRequestSend self p = sendXhrPayload self p `catch` (throwIO . convertException)
6463
64+
6565xmlHttpRequestSetRequestHeader :: (ToJSString header, ToJSString value)
6666 => XMLHttpRequest -> header -> value -> IO ()
6767xmlHttpRequestSetRequestHeader = setRequestHeader
@@ -133,16 +133,21 @@ xmlHttpRequestGetResponseXML = getResponseXML
133133xmlHttpRequestSetResponseType :: XMLHttpRequest -> XMLHttpRequestResponseType -> IO ()
134134xmlHttpRequestSetResponseType = setResponseType
135135
136−toResponseType :: XhrResponseType -> XMLHttpRequestResponseType
137−toResponseType XhrResponseType_Default = XMLHttpRequestResponseType
138−toResponseType XhrResponseType_ArrayBuffer = XMLHttpRequestResponseTypeArraybuffer
139−toResponseType XhrResponseType_Blob = XMLHttpRequestResponseTypeBlob
140−toResponseType XhrResponseType_Document = XMLHttpRequestResponseTypeDocument
141−toResponseType XhrResponseType_JSON = XMLHttpRequestResponseTypeJson
142−toResponseType XhrResponseType_Text = XMLHttpRequestResponseTypeText
136+fromResponseType :: XhrResponseType -> XMLHttpRequestResponseType
137+fromResponseType XhrResponseType_Default = XMLHttpRequestResponseType
138+fromResponseType XhrResponseType_ArrayBuffer = XMLHttpRequestResponseTypeArraybuffer
139+fromResponseType XhrResponseType_Blob = XMLHttpRequestResponseTypeBlob
140+fromResponseType XhrResponseType_Text = XMLHttpRequestResponseTypeText
141+
142+toResponseType :: XMLHttpRequestResponseType -> Maybe XhrResponseType
143+toResponseType XMLHttpRequestResponseType = Just XhrResponseType_Default
144+toResponseType XMLHttpRequestResponseTypeArraybuffer = Just XhrResponseType_ArrayBuffer
145+toResponseType XMLHttpRequestResponseTypeBlob = Just XhrResponseType_Blob
146+toResponseType XMLHttpRequestResponseTypeText = Just XhrResponseType_Text
147+toResponseType _ = Nothing
143148
144−xmlHttpRequestGetResponseType :: XMLHttpRequest -> IO XMLHttpRequestResponseType
145−xmlHttpRequestGetResponseType = getResponseType
149+xmlHttpRequestGetResponseType :: XMLHttpRequest -> IO (Maybe XhrResponseType)
150+xmlHttpRequestGetResponseType = fmap toResponseType . getResponseType
146151
147152xmlHttpRequestGetStatus :: XMLHttpRequest -> IO Word
148153xmlHttpRequestGetStatus = getStatus
@@ -156,5 +161,13 @@ xmlHttpRequestGetResponseURL = getResponseURL
156161xmlHttpRequestGetResponse :: XMLHttpRequest -> IO (Maybe XhrResponseBody)
157162xmlHttpRequestGetResponse xhr = do
158163 mr <- getResponse xhr
159− return $ fmap (\(GObject r) -> XhrResponseBody r) mr
164+ rt <- xmlHttpRequestGetResponseType xhr
165+ case rt of
166+ Just XhrResponseType_Blob -> return $ fmap (XhrResponseBody_Blob . castToBlob) mr
167+ Just XhrResponseType_Text -> fmap (Just . XhrResponseBody_Text) $ xmlHttpRequestGetStatusText xhr
168+ Just XhrResponseType_Default -> fmap (Just . XhrResponseBody_Text) $ xmlHttpRequestGetStatusText xhr
169+ Just XhrResponseType_ArrayBuffer -> case (fmap unGObject mr) of
170+ Nothing -> return Nothing
171+ Just ptr -> fmap (Just . XhrResponseBody_ArrayBuffer) $ bsFromArrayBuffer ptr ptr
172+ _ -> return Nothing
160173
src/Reflex/Dom/Widget/Basic.hs+7−1
@@ -167,8 +167,14 @@ widgetHoldInternal child0 newChild = do
167167 forM_ mp' $ \p' -> insertBefore p' (Just df) (Just endPlaceholder)
168168 return ()
169169 addVoidAction $ ffor newChild $ \c -> do
170+ Just df <- createDocumentFragment doc
171+ (result, postBuild, voidActions) <- runWidget df c
172+ runFrameWithTriggerRef newChildBuiltTriggerRef (result, voidActions)
173+ postBuild
170174 liftIO $ deleteBetweenExclusive startPlaceholder endPlaceholder
171− build c
175+ mp' <- getParentNode endPlaceholder
176+ forM_ mp' $ \p' -> insertBefore p' (Just df) (Just endPlaceholder)
177+ return ()
172178 return (result0, fmap fst newChildBuilt)
173179
174180diffMapNoEq :: (Ord k) => Map k v -> Map k v -> Map k (Maybe v)
src/Reflex/Dom/Xhr.hs+6−1
@@ -17,6 +17,8 @@ module Reflex.Dom.Xhr
1717 , performRequestAsyncWithError
1818 , performRequestsAsync
1919 , performMkRequestsAsync
20+ , performRequestAsyncWithError
21+ , performRequestsAsync
2022 , performRequestsAsyncWithError
2123 , getAndDecode
2224 , postJson
@@ -69,7 +71,10 @@ import Data.Maybe
6971import Data.Text (Text)
7072import Data.Text.Encoding
7173import Data.Traversable
74+import Reflex
75+import Reflex.Dom.Class
7276import Reflex.Dom.Xhr.Exception
77+import Reflex.Dom.Xhr.Foreign
7378import Reflex.Dom.Xhr.ResponseType
7479import Data.Typeable
7580
@@ -145,7 +150,7 @@ newXMLHttpRequestWithError req cb = do
145150 (fromMaybe "" $ _xhrRequestConfig_user c)
146151 (fromMaybe "" $ _xhrRequestConfig_password c)
147152 iforM_ (_xhrRequestConfig_headers c) $ xmlHttpRequestSetRequestHeader xhr
148− maybe (return ()) (xmlHttpRequestSetResponseType xhr . toResponseType) rt
153+ maybe (return ()) (xmlHttpRequestSetResponseType xhr . fromResponseType) rt
149154 _ <- xmlHttpRequestOnreadystatechange xhr $ do
150155 readyState <- liftIO $ xmlHttpRequestGetReadyState xhr
151156 status <- liftIO $ xmlHttpRequestGetStatus xhr
src/Reflex/Dom/Xhr/ResponseType.hs+9−2
@@ -3,12 +3,19 @@
33module Reflex.Dom.Xhr.ResponseType where
44
55import Data.Typeable
6+import Data.Text (Text)
7+import GHCJS.DOM.Blob (Blob)
8+import Data.ByteString (ByteString)
69
710data XhrResponseType = XhrResponseType_Default
811 | XhrResponseType_ArrayBuffer
912 | XhrResponseType_Blob
10− | XhrResponseType_Document
11− | XhrResponseType_JSON
1213 | XhrResponseType_Text
1314 deriving (Show, Read, Eq, Ord, Typeable)
1415
16+data XhrResponseBody = XhrResponseBody_Default Text
17+ | XhrResponseBody_Text Text
18+ | XhrResponseBody_Blob Blob
19+ | XhrResponseBody_ArrayBuffer ByteString
20+ deriving (Eq)
21+