@@ -1,6 +1,7 @@
1{-# LANGUAGE ForeignFunctionInterface, OverloadedStrings #-}
1{-# LANGUAGE ForeignFunctionInterface, OverloadedStrings #-}
2module Language.Javascript.JSaddle.WKWebView.Internal
2module Language.Javascript.JSaddle.WKWebView.Internal
3 ( jsaddleMain
3 ( jsaddleMain
4 , WKWebView(..)
5 , WKWebView(..)
@@ -9,6 +10,7 @@ import Control.Concurrent (forkIO)
10import Data.Monoid ((<>))
11import Data.Monoid ((<>))
11import Data.ByteString (useAsCString, packCString)
12import Data.ByteString (useAsCString, packCString)
13+import qualified Data.ByteString as BS (ByteString)
12import Data.ByteString.Lazy (ByteString, toStrict, fromStrict)
14import Data.ByteString.Lazy (ByteString, toStrict, fromStrict)
13import Data.Aeson (encode, decode)
15import Data.Aeson (encode, decode)
@@ -27,10 +29,32 @@ foreign export ccall jsaddleResult :: StablePtr (Results -> IO ()) -> CString ->
27foreign export ccall withWebView :: WKWebView -> StablePtr (WKWebView -> IO ()) -> IO ()
29foreign export ccall withWebView :: WKWebView -> StablePtr (WKWebView -> IO ()) -> IO ()
28foreign import ccall addJSaddleHandler :: WKWebView -> StablePtr (IO ()) -> StablePtr (Results -> IO ()) -> IO ()
30foreign import ccall addJSaddleHandler :: WKWebView -> StablePtr (IO ()) -> StablePtr (Results -> IO ()) -> IO ()
29foreign import ccall loadHTMLString :: WKWebView -> CString -> IO ()
31foreign import ccall loadHTMLString :: WKWebView -> CString -> IO ()
32+foreign import ccall loadBundleFile :: WKWebView -> CString -> CString -> IO ()
30foreign import ccall evaluateJavaScript :: WKWebView -> CString -> IO ()
33foreign import ccall evaluateJavaScript :: WKWebView -> CString -> IO ()
35+-- | Run JSaddle in WKWebView
32jsaddleMain :: JSM () -> WKWebView -> IO ()
36jsaddleMain :: JSM () -> WKWebView -> IO ()
33jsaddleMain f webView = do
37jsaddleMain f webView = do
38+ jsaddleMain' f webView
40+ useAsCString (toStrict indexHtml) $ loadHTMLString webView
41+ useAsCString (toStrict jsaddleJs) $ evaluateJavaScript webView
43+-- | Run JSaddle in a WKWebView first loading the specified file
44+-- from the mainBundle (relative to the resourcePath).
45+jsaddleMainFile :: BS.ByteString -- ^ The file to navigate to.
46+ -> BS.ByteString -- ^ The path to allow read access to.
47+ -> JSM () -> WKWebView -> IO ()
48+jsaddleMainFile url allowing f webView = do
49+ jsaddleMain' f webView
51+ useAsCString url $ \u ->
52+ useAsCString allowing $ \a ->
53+ loadBundleFile webView u a
54+ useAsCString (toStrict jsaddleJs) $ evaluateJavaScript webView
56+jsaddleMain' :: JSM () -> WKWebView -> IO ()
57+jsaddleMain' f webView = do
34 (processResult, start) <- runJavaScript (\batch ->
58 (processResult, start) <- runJavaScript (\batch ->
35 useAsCString (toStrict $ "runJSaddleBatch(" <> encode batch <> ");") $
59 useAsCString (toStrict $ "runJSaddleBatch(" <> encode batch <> ");") $
36 evaluateJavaScript webView)
60 evaluateJavaScript webView)
@@ -40,9 +64,6 @@ jsaddleMain f webView = do
40 resultHandler <- newStablePtr processResult
64 resultHandler <- newStablePtr processResult
41 addJSaddleHandler webView startHandler resultHandler
65 addJSaddleHandler webView startHandler resultHandler
43− useAsCString (toStrict indexHtml) $ loadHTMLString webView
44− useAsCString (toStrict jsaddleJs) $ evaluateJavaScript webView
46jsaddleStart :: StablePtr (IO ()) -> IO ()
67jsaddleStart :: StablePtr (IO ()) -> IO ()
47jsaddleStart ptrHandler = join (deRefStablePtr ptrHandler)
68jsaddleStart ptrHandler = join (deRefStablePtr ptrHandler)