on master help sign in
Merge branch 'master' of github.com:ghcjs/jsaddle
474482bDan Haraj
jsaddle-wkwebview/cbits/WKWebView.m+8
@@ -53,6 +53,14 @@ 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+const char * mainBundleResourcePathC() {
57+ NSBundle *main = [NSBundle mainBundle];
58+ if(!main) return NULL;
59+ NSString *path = main.resourcePath;
60+ if(!path) return NULL;
61+ return [path UTF8String];
62+}
63+
56void loadBundleFile(WKWebView *webView, const char * _Nonnull file, const char * _Nonnull allowing) {
64void loadBundleFile(WKWebView *webView, const char * _Nonnull file, const char * _Nonnull allowing) {
57 NSBundle *main = [NSBundle mainBundle];
65 NSBundle *main = [NSBundle mainBundle];
58 if(main) {
66 if(main) {
jsaddle-wkwebview/src-ghc/Language/Javascript/JSaddle/WKWebView.hs+2−1
@@ -4,10 +4,11 @@ module Language.Javascript.JSaddle.WKWebView
4 , WKWebView(..)
4 , WKWebView(..)
5 , run
5 , run
6 , runFile
6 , runFile
7+ , mainBundleResourcePath
7 ) where
8 ) where
8
9
9import Data.ByteString (ByteString)
10import Data.ByteString (ByteString)
10−import Language.Javascript.JSaddle.WKWebView.Internal (jsaddleMain, jsaddleMainFile, WKWebView(..))
11+import Language.Javascript.JSaddle.WKWebView.Internal (jsaddleMain, jsaddleMainFile, WKWebView(..), mainBundleResourcePath)
11import System.Environment (getProgName)
12import System.Environment (getProgName)
12import Foreign.C.String (CString, withCString)
13import Foreign.C.String (CString, withCString)
13import Foreign.StablePtr (StablePtr, newStablePtr)
14import Foreign.StablePtr (StablePtr, newStablePtr)
jsaddle-wkwebview/src/Language/Javascript/JSaddle/WKWebView/Internal.hs+12−4
@@ -3,6 +3,7 @@ module Language.Javascript.JSaddle.WKWebView.Internal
3 ( jsaddleMain
3 ( jsaddleMain
4 , jsaddleMainFile
4 , jsaddleMainFile
5 , WKWebView(..)
5 , WKWebView(..)
6+ , mainBundleResourcePath
6 ) where
7 ) where
7
8
8import Control.Monad (void, join)
9import Control.Monad (void, join)
@@ -15,7 +16,7 @@ import Data.ByteString.Lazy (ByteString, toStrict, fromStrict)
15import Data.Aeson (encode, decode)
16import Data.Aeson (encode, decode)
16
17
17import Foreign.C.String (CString)
18import Foreign.C.String (CString)
18−import Foreign.Ptr (Ptr)
19+import Foreign.Ptr (Ptr, nullPtr)
19import Foreign.StablePtr (StablePtr, newStablePtr, deRefStablePtr)
20import Foreign.StablePtr (StablePtr, newStablePtr, deRefStablePtr)
20
21
21import Language.Javascript.JSaddle (Results, JSM)
22import Language.Javascript.JSaddle (Results, JSM)
@@ -31,6 +32,7 @@ foreign import ccall addJSaddleHandler :: WKWebView -> StablePtr (IO ()) -> Stab
31foreign import ccall loadHTMLString :: WKWebView -> CString -> IO ()
32foreign import ccall loadHTMLString :: WKWebView -> CString -> IO ()
32foreign import ccall loadBundleFile :: WKWebView -> CString -> CString -> IO ()
33foreign import ccall loadBundleFile :: WKWebView -> CString -> CString -> IO ()
33foreign import ccall evaluateJavaScript :: WKWebView -> CString -> IO ()
34foreign import ccall evaluateJavaScript :: WKWebView -> CString -> IO ()
35+foreign import ccall mainBundleResourcePathC :: IO CString
34
36
35-- | Run JSaddle in WKWebView
37-- | Run JSaddle in WKWebView
36jsaddleMain :: JSM () -> WKWebView -> IO ()
38jsaddleMain :: JSM () -> WKWebView -> IO ()
@@ -38,7 +40,6 @@ jsaddleMain f webView = do
38 jsaddleMain' f webView
40 jsaddleMain' f webView
39
41
40 useAsCString (toStrict indexHtml) $ loadHTMLString webView
42 useAsCString (toStrict indexHtml) $ loadHTMLString webView
41− useAsCString (toStrict jsaddleJs) $ evaluateJavaScript webView
42
43
43-- | Run JSaddle in a WKWebView first loading the specified file
44-- | Run JSaddle in a WKWebView first loading the specified file
44-- from the mainBundle (relative to the resourcePath).
45-- from the mainBundle (relative to the resourcePath).
@@ -51,7 +52,6 @@ jsaddleMainFile url allowing f webView = do
51 useAsCString url $ \u ->
52 useAsCString url $ \u ->
52 useAsCString allowing $ \a ->
53 useAsCString allowing $ \a ->
53 loadBundleFile webView u a
54 loadBundleFile webView u a
54− useAsCString (toStrict jsaddleJs) $ evaluateJavaScript webView
55
55
56jsaddleMain' :: JSM () -> WKWebView -> IO ()
56jsaddleMain' :: JSM () -> WKWebView -> IO ()
57jsaddleMain' f webView = do
57jsaddleMain' f webView = do
@@ -60,7 +60,8 @@ jsaddleMain' f webView = do
60 evaluateJavaScript webView)
60 evaluateJavaScript webView)
61 f
61 f
62
62
63− startHandler <- newStablePtr (void $ forkIO start)
63+ startHandler <- newStablePtr (
64+ useAsCString (toStrict jsaddleJs) (evaluateJavaScript webView) >> void (forkIO start))
64 resultHandler <- newStablePtr processResult
65 resultHandler <- newStablePtr processResult
65 addJSaddleHandler webView startHandler resultHandler
66 addJSaddleHandler webView startHandler resultHandler
66
67
@@ -100,3 +101,10 @@ indexHtml =
100 \<body>\n\
101 \<body>\n\
101 \</body>\n\
102 \</body>\n\
102 \</html>"
103 \</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