@@ -2,8 +2,10 @@
2module Language.Javascript.JSaddle.WKWebView
2module Language.Javascript.JSaddle.WKWebView
3 ( jsaddleMain
3 ( jsaddleMain
4 , WKWebView(..)
4 , WKWebView(..)
8+import System.Environment (getProgName)
7import Control.Monad (void, join)
9import Control.Monad (void, join)
8import Control.Concurrent (forkIO)
10import Control.Concurrent (forkIO)
@@ -12,22 +14,29 @@ import Data.ByteString (useAsCString, packCString)
12import Data.ByteString.Lazy (ByteString, toStrict, fromStrict)
14import Data.ByteString.Lazy (ByteString, toStrict, fromStrict)
13import Data.Aeson (encode, decode)
15import Data.Aeson (encode, decode)
15−import Foreign.C.String (CString)
17+import Foreign.C.String (CString, withCString)
16import Foreign.Ptr (Ptr)
18import Foreign.Ptr (Ptr)
17import Foreign.StablePtr (StablePtr, newStablePtr, deRefStablePtr)
19import Foreign.StablePtr (StablePtr, newStablePtr, deRefStablePtr)
19−import Language.Javascript.JSaddle (Result, JSM)
21+import Language.Javascript.JSaddle (Results, JSM)
20−import Language.Javascript.JSaddle.Types (Batch(..))
21import Language.Javascript.JSaddle.Run (runJavaScript)
22import Language.Javascript.JSaddle.Run (runJavaScript)
22import Language.Javascript.JSaddle.Run.Files (initState, runBatch, ghcjsHelpers)
23import Language.Javascript.JSaddle.Run.Files (initState, runBatch, ghcjsHelpers)
24newtype WKWebView = WKWebView (Ptr WKWebView)
25newtype WKWebView = WKWebView (Ptr WKWebView)
26foreign export ccall jsaddleStart :: StablePtr (IO ()) -> IO ()
27foreign export ccall jsaddleStart :: StablePtr (IO ()) -> IO ()
27−foreign export ccall jsaddleResult :: StablePtr (Result -> IO ()) -> CString -> IO ()
28+foreign export ccall jsaddleResult :: StablePtr (Results -> IO ()) -> CString -> IO ()
29+foreign export ccall withWebView :: WKWebView -> StablePtr (WKWebView -> IO ()) -> IO ()
28−foreign import ccall addJSaddleHandler :: WKWebView -> StablePtr (IO ()) -> StablePtr (Result -> IO ()) -> IO ()
30+foreign import ccall addJSaddleHandler :: WKWebView -> StablePtr (IO ()) -> StablePtr (Results -> IO ()) -> IO ()
29foreign import ccall loadHTMLString :: WKWebView -> CString -> IO ()
31foreign import ccall loadHTMLString :: WKWebView -> CString -> IO ()
30foreign import ccall evaluateJavaScript :: WKWebView -> CString -> IO ()
32foreign import ccall evaluateJavaScript :: WKWebView -> CString -> IO ()
33+foreign import ccall runInWKWebView :: StablePtr (WKWebView -> IO ()) -> CString -> IO ()
35+run :: JSM () -> IO ()
37+ handler <- newStablePtr (jsaddleMain f)
38+ progName <- getProgName
39+ withCString progName $ runInWKWebView handler
32jsaddleMain :: JSM () -> WKWebView -> IO ()
41jsaddleMain :: JSM () -> WKWebView -> IO ()
33jsaddleMain f webView = do
42jsaddleMain f webView = do
@@ -46,7 +55,7 @@ jsaddleMain f webView = do
46jsaddleStart :: StablePtr (IO ()) -> IO ()
55jsaddleStart :: StablePtr (IO ()) -> IO ()
47jsaddleStart ptrHandler = join (deRefStablePtr ptrHandler)
56jsaddleStart ptrHandler = join (deRefStablePtr ptrHandler)
49−jsaddleResult :: StablePtr (Result -> IO ()) -> CString -> IO ()
58+jsaddleResult :: StablePtr (Results -> IO ()) -> CString -> IO ()
50jsaddleResult ptrHandler s = do
59jsaddleResult ptrHandler s = do
51 processResult <- deRefStablePtr ptrHandler
60 processResult <- deRefStablePtr ptrHandler
52 result <- packCString s
61 result <- packCString s
@@ -54,6 +63,11 @@ jsaddleResult ptrHandler s = do
54 Nothing -> error $ "jsaddle WebSocket decode failed : " <> show result
63 Nothing -> error $ "jsaddle WebSocket decode failed : " <> show result
55 Just r -> processResult r
64 Just r -> processResult r
66+withWebView :: WKWebView -> StablePtr (WKWebView -> IO ()) -> IO ()
67+withWebView webView ptrF = do
68+ f <- deRefStablePtr ptrF
57jsaddleJs :: ByteString
71jsaddleJs :: ByteString
58jsaddleJs = ghcjsHelpers <> "\
72jsaddleJs = ghcjsHelpers <> "\
59 \runJSaddleBatch = (function() {\n\
73 \runJSaddleBatch = (function() {\n\