@@ -2,8 +2,10 @@
22module Language.Javascript.JSaddle.WKWebView
33 ( jsaddleMain
44 , WKWebView(..)
5+ , run
56 ) where
67
8+import System.Environment (getProgName)
79import Control.Monad (void, join)
810import Control.Concurrent (forkIO)
911
@@ -12,22 +14,29 @@ import Data.ByteString (useAsCString, packCString)
1214import Data.ByteString.Lazy (ByteString, toStrict, fromStrict)
1315import Data.Aeson (encode, decode)
1416
15−import Foreign.C.String (CString)
17+import Foreign.C.String (CString, withCString)
1618import Foreign.Ptr (Ptr)
1719import Foreign.StablePtr (StablePtr, newStablePtr, deRefStablePtr)
1820
19−import Language.Javascript.JSaddle (Result, JSM)
20−import Language.Javascript.JSaddle.Types (Batch(..))
21+import Language.Javascript.JSaddle (Results, JSM)
2122import Language.Javascript.JSaddle.Run (runJavaScript)
2223import Language.Javascript.JSaddle.Run.Files (initState, runBatch, ghcjsHelpers)
2324
2425newtype WKWebView = WKWebView (Ptr WKWebView)
2526
2627foreign export ccall jsaddleStart :: StablePtr (IO ()) -> IO ()
27−foreign export ccall jsaddleResult :: StablePtr (Result -> IO ()) -> CString -> IO ()
28−foreign import ccall addJSaddleHandler :: WKWebView -> StablePtr (IO ()) -> StablePtr (Result -> IO ()) -> IO ()
28+foreign export ccall jsaddleResult :: StablePtr (Results -> IO ()) -> CString -> IO ()
29+foreign export ccall withWebView :: WKWebView -> StablePtr (WKWebView -> IO ()) -> IO ()
30+foreign import ccall addJSaddleHandler :: WKWebView -> StablePtr (IO ()) -> StablePtr (Results -> IO ()) -> IO ()
2931foreign import ccall loadHTMLString :: WKWebView -> CString -> IO ()
3032foreign import ccall evaluateJavaScript :: WKWebView -> CString -> IO ()
33+foreign import ccall runInWKWebView :: StablePtr (WKWebView -> IO ()) -> CString -> IO ()
34+
35+run :: JSM () -> IO ()
36+run f = do
37+ handler <- newStablePtr (jsaddleMain f)
38+ progName <- getProgName
39+ withCString progName $ runInWKWebView handler
3140
3241jsaddleMain :: JSM () -> WKWebView -> IO ()
3342jsaddleMain f webView = do
@@ -46,7 +55,7 @@ jsaddleMain f webView = do
4655jsaddleStart :: StablePtr (IO ()) -> IO ()
4756jsaddleStart ptrHandler = join (deRefStablePtr ptrHandler)
4857
49−jsaddleResult :: StablePtr (Result -> IO ()) -> CString -> IO ()
58+jsaddleResult :: StablePtr (Results -> IO ()) -> CString -> IO ()
5059jsaddleResult ptrHandler s = do
5160 processResult <- deRefStablePtr ptrHandler
5261 result <- packCString s
@@ -54,6 +63,11 @@ jsaddleResult ptrHandler s = do
5463 Nothing -> error $ "jsaddle WebSocket decode failed : " <> show result
5564 Just r -> processResult r
5665
66+withWebView :: WKWebView -> StablePtr (WKWebView -> IO ()) -> IO ()
67+withWebView webView ptrF = do
68+ f <- deRefStablePtr ptrF
69+ f webView
70+
5771jsaddleJs :: ByteString
5872jsaddleJs = ghcjsHelpers <> "\
5973 \runJSaddleBatch = (function() {\n\