@@ -3,6 +3,7 @@ module Language.Javascript.JSaddle.WKWebView.Internal
33 ( jsaddleMain
44 , jsaddleMainFile
55 , WKWebView(..)
6+ , mainBundleResourcePath
67 ) where
78
89import Control.Monad (void, join)
@@ -15,7 +16,7 @@ import Data.ByteString.Lazy (ByteString, toStrict, fromStrict)
1516import Data.Aeson (encode, decode)
1617
1718import Foreign.C.String (CString)
18−import Foreign.Ptr (Ptr)
19+import Foreign.Ptr (Ptr, nullPtr)
1920import Foreign.StablePtr (StablePtr, newStablePtr, deRefStablePtr)
2021
2122import Language.Javascript.JSaddle (Results, JSM)
@@ -31,6 +32,7 @@ foreign import ccall addJSaddleHandler :: WKWebView -> StablePtr (IO ()) -> Stab
3132foreign import ccall loadHTMLString :: WKWebView -> CString -> IO ()
3233foreign import ccall loadBundleFile :: WKWebView -> CString -> CString -> IO ()
3334foreign import ccall evaluateJavaScript :: WKWebView -> CString -> IO ()
35+foreign import ccall mainBundleResourcePathC :: IO CString
3436
3537-- | Run JSaddle in WKWebView
3638jsaddleMain :: JSM () -> WKWebView -> IO ()
@@ -38,7 +40,6 @@ jsaddleMain f webView = do
3840 jsaddleMain' f webView
3941
4042 useAsCString (toStrict indexHtml) $ loadHTMLString webView
41− useAsCString (toStrict jsaddleJs) $ evaluateJavaScript webView
4243
4344-- | Run JSaddle in a WKWebView first loading the specified file
4445-- from the mainBundle (relative to the resourcePath).
@@ -51,7 +52,6 @@ jsaddleMainFile url allowing f webView = do
5152 useAsCString url $ \u ->
5253 useAsCString allowing $ \a ->
5354 loadBundleFile webView u a
54− useAsCString (toStrict jsaddleJs) $ evaluateJavaScript webView
5555
5656jsaddleMain' :: JSM () -> WKWebView -> IO ()
5757jsaddleMain' f webView = do
@@ -60,7 +60,8 @@ jsaddleMain' f webView = do
6060 evaluateJavaScript webView)
6161 f
6262
63− startHandler <- newStablePtr (void $ forkIO start)
63+ startHandler <- newStablePtr (
64+ useAsCString (toStrict jsaddleJs) (evaluateJavaScript webView) >> void (forkIO start))
6465 resultHandler <- newStablePtr processResult
6566 addJSaddleHandler webView startHandler resultHandler
6667
@@ -100,3 +101,10 @@ indexHtml =
100101 \<body>\n\
101102 \</body>\n\
102103 \</html>"
104+
105+mainBundleResourcePath :: IO (Maybe BS.ByteString)
106+mainBundleResourcePath = do
107+ bs <- mainBundleResourcePathC
108+ if bs == nullPtr
109+ then return Nothing
110+ else Just <$> packCString bs