packages feed

reflex-dom-0.3: src-ghcjs/Reflex/Dom/Internal/Foreign.hs

{-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI #-}
module Reflex.Dom.Internal.Foreign ( module Reflex.Dom.Internal.Foreign
                                   , runWebGUI
                                   ) where

import Control.Monad
import Data.ByteString (ByteString)
import Foreign
import Foreign.C
import GHCJS.DOM
import GHCJS.DOM.Types
import GHCJS.Types
import JavaScript.TypedArray.ArrayBuffer as JS
import qualified Data.ByteString as BS
import qualified GHCJS.Buffer as JS
import qualified GHCJS.Marshal.Pure as JS

quitWebView :: WebView -> IO ()
quitWebView = error "quitWebView: unimplemented in GHCJS"

foreign import javascript unsafe "location['host']" getLocationHost_ :: IO JSString

getLocationHost :: FromJSString r => a -> IO r
getLocationHost _ = liftM fromJSString getLocationHost_

foreign import javascript unsafe "location['protocol']" getLocationProtocol_ :: IO JSString

getLocationProtocol :: FromJSString r => a -> IO r
getLocationProtocol _ = liftM fromJSString getLocationProtocol_

withWebViewContext :: a -> (a -> IO b) -> IO b
withWebViewContext a f = f a

foreign import javascript safe "new DataView($3,$1,$2)" js_dataView :: Int -> Int -> JSVal -> JSVal

foreign import javascript unsafe "new Uint8Array($1_1['buf'], $1_2, $2)['buffer']" extractByteArray :: Ptr CChar -> Int -> IO JSVal

bsToArrayBuffer :: a -> ByteString -> IO JSVal
bsToArrayBuffer _ bs = BS.useAsCString bs $ \cStr -> do
  extractByteArray cStr $ BS.length bs

bsFromArrayBuffer :: a -> JSVal -> IO ByteString
bsFromArrayBuffer _ ab = liftM (JS.toByteString 0 Nothing . JS.createFromArrayBuffer) $ JS.unsafeFreeze $ JS.pFromJSVal ab