@@ -7,7 +7,8 @@ module Language.Javascript.JSaddle.WKWebView.Internal
77 ) where
88
99import Control.Monad (void, join)
10−import Control.Concurrent (forkIO)
10+import Control.Concurrent (forkIO, forkOS)
11+import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar)
1112
1213import Data.Monoid ((<>))
1314import Data.ByteString (useAsCString, packCString)
@@ -37,9 +38,8 @@ foreign import ccall mainBundleResourcePathC :: IO CString
3738-- | Run JSaddle in WKWebView
3839jsaddleMain :: JSM () -> WKWebView -> IO ()
3940jsaddleMain f webView = do
40− jsaddleMain' f webView
41−
42− useAsCString (toStrict indexHtml) $ loadHTMLString webView
41+ jsaddleMain' f webView $
42+ useAsCString (toStrict indexHtml) $ loadHTMLString webView
4343
4444-- | Run JSaddle in a WKWebView first loading the specified file
4545-- from the mainBundle (relative to the resourcePath).
@@ -47,23 +47,27 @@ jsaddleMainFile :: BS.ByteString -- ^ The file to navigate to.
4747 -> BS.ByteString -- ^ The path to allow read access to.
4848 -> JSM () -> WKWebView -> IO ()
4949jsaddleMainFile url allowing f webView = do
50− jsaddleMain' f webView
50+ jsaddleMain' f webView $
51+ useAsCString url $ \u ->
52+ useAsCString allowing $ \a ->
53+ loadBundleFile webView u a
5154
52− useAsCString url $ \u ->
53− useAsCString allowing $ \a ->
54− loadBundleFile webView u a
55+jsaddleMain' :: JSM () -> WKWebView -> IO () -> IO ()
56+jsaddleMain' f webView loadHtml = do
57+ ready <- newEmptyMVar
5558
56−jsaddleMain' :: JSM () -> WKWebView -> IO ()
57−jsaddleMain' f webView = do
5859 (processResult, start) <- runJavaScript (\batch ->
5960 useAsCString (toStrict $ "runJSaddleBatch(" <> encode batch <> ");") $
6061 evaluateJavaScript webView)
6162 f
6263
63− startHandler <- newStablePtr (
64− useAsCString (toStrict jsaddleJs) (evaluateJavaScript webView) >> void (forkIO start))
64+ startHandler <- newStablePtr (putMVar ready ())
6565 resultHandler <- newStablePtr processResult
6666 addJSaddleHandler webView startHandler resultHandler
67+ loadHtml
68+ void . forkOS $ do
69+ takeMVar ready
70+ useAsCString (toStrict jsaddleJs) (evaluateJavaScript webView) >> void (forkIO start)
6771
6872jsaddleStart :: StablePtr (IO ()) -> IO ()
6973jsaddleStart ptrHandler = join (deRefStablePtr ptrHandler)