on master help sign in
Add runFile (for loading files from app bundle)
f03fff8Hamish Mackenzie
jsaddle-wkwebview/cbits/WKWebView.m+14
@@ -53,3 +53,17 @@ void loadHTMLString(WKWebView *webView, const char * _Nonnull html) {
53 [webView loadHTMLString:[NSString stringWithCString:html encoding:NSUTF8StringEncoding] baseURL:NULL];
53 [webView loadHTMLString:[NSString stringWithCString:html encoding:NSUTF8StringEncoding] baseURL:NULL];
54}
54}
55
55
56+void loadBundleFile(WKWebView *webView, const char * _Nonnull file, const char * _Nonnull allowing) {
57+ NSBundle *main = [NSBundle mainBundle];
58+ if(main) {
59+ NSString *path = main.resourcePath;
60+ if(path) {
61+ NSURL *fileUrl = [NSURL fileURLWithPath:[NSString stringWithFormat: @"%@/%@", path, [NSString stringWithCString:file encoding:NSUTF8StringEncoding]]];
62+ NSURL *allowingUrl = [NSURL fileURLWithPath:[NSString stringWithFormat: @"%@/%@", path, [NSString stringWithCString:allowing encoding:NSUTF8StringEncoding]]];
63+ [webView loadFileURL:fileUrl allowingReadAccessToURL:allowingUrl];
64+ }
65+ }
66+}
67+
68+
69+
jsaddle-wkwebview/src-ghc/Language/Javascript/JSaddle/WKWebView.hs+15−1
@@ -1,10 +1,13 @@
1module Language.Javascript.JSaddle.WKWebView
1module Language.Javascript.JSaddle.WKWebView
2 ( jsaddleMain
2 ( jsaddleMain
3+ , jsaddleMainFile
3 , WKWebView(..)
4 , WKWebView(..)
4 , run
5 , run
6+ , runFile
5 ) where
7 ) where
6
8
9+import Data.ByteString (ByteString)
7−import Language.Javascript.JSaddle.WKWebView.Internal (jsaddleMain, WKWebView(..))
10+import Language.Javascript.JSaddle.WKWebView.Internal (jsaddleMain, jsaddleMainFile, WKWebView(..))
8import System.Environment (getProgName)
11import System.Environment (getProgName)
9import Foreign.C.String (CString, withCString)
12import Foreign.C.String (CString, withCString)
10import Foreign.StablePtr (StablePtr, newStablePtr)
13import Foreign.StablePtr (StablePtr, newStablePtr)
@@ -12,8 +15,19 @@ import Language.Javascript.JSaddle (JSM)
12
15
13foreign import ccall runInWKWebView :: StablePtr (WKWebView -> IO ()) -> CString -> IO ()
16foreign import ccall runInWKWebView :: StablePtr (WKWebView -> IO ()) -> CString -> IO ()
14
17
18+-- | Run JSaddle in a WKWebView
15run :: JSM () -> IO ()
19run :: JSM () -> IO ()
16run f = do
20run f = do
17 handler <- newStablePtr (jsaddleMain f)
21 handler <- newStablePtr (jsaddleMain f)
18 progName <- getProgName
22 progName <- getProgName
19 withCString progName $ runInWKWebView handler
23 withCString progName $ runInWKWebView handler
24+
25+-- | Run JSaddle in a WKWebView first loading the specified file
26+-- from the mainBundle (relative to the resourcePath).
27+runFile :: ByteString -- ^ The file to navigate to.
28+ -> ByteString -- ^ The path to allow read access to.
29+ -> JSM () -> IO ()
30+runFile url allowing f = do
31+ handler <- newStablePtr (jsaddleMainFile url allowing f)
32+ progName <- getProgName
33+ withCString progName $ runInWKWebView handler
jsaddle-wkwebview/src/Language/Javascript/JSaddle/WKWebView/Internal.hs+24−3
@@ -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+ , jsaddleMainFile
4 , WKWebView(..)
5 , WKWebView(..)
5 ) where
6 ) where
6
7
@@ -9,6 +10,7 @@ import Control.Concurrent (forkIO)
9
10
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)
14
16
@@ -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 ()
31
34
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
39+
40+ useAsCString (toStrict indexHtml) $ loadHTMLString webView
41+ useAsCString (toStrict jsaddleJs) $ evaluateJavaScript webView
42+
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
50+
51+ useAsCString url $ \u ->
52+ useAsCString allowing $ \a ->
53+ loadBundleFile webView u a
54+ useAsCString (toStrict jsaddleJs) $ evaluateJavaScript webView
55+
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
42
66
43− useAsCString (toStrict indexHtml) $ loadHTMLString webView
44− useAsCString (toStrict jsaddleJs) $ evaluateJavaScript webView
45−
46jsaddleStart :: StablePtr (IO ()) -> IO ()
67jsaddleStart :: StablePtr (IO ()) -> IO ()
47jsaddleStart ptrHandler = join (deRefStablePtr ptrHandler)
68jsaddleStart ptrHandler = join (deRefStablePtr ptrHandler)
48
69
jsaddle/jsaddle.cabal+1−1
@@ -1,5 +1,5 @@
1name: jsaddle
1name: jsaddle
2−version: 0.8.0.1
2+version: 0.8.1.0
3cabal-version: >=1.10
3cabal-version: >=1.10
4build-type: Simple
4build-type: Simple
5license: MIT
5license: MIT