on master help sign in
Add runHTMLWithBaseURL to jsaddle-wkwebview
7eb50cbHamish Mackenzie
jsaddle-wkwebview/cbits/WKWebView.m+1−1
@@ -97,7 +97,7 @@ void completeSync(JSaddleHandler *handler, const char * _Nonnull s) {
97
97
98void loadHTMLStringWithBaseURL(WKWebView *webView, const char * _Nonnull html, const char * _Nonnull url) {
98void loadHTMLStringWithBaseURL(WKWebView *webView, const char * _Nonnull html, const char * _Nonnull url) {
99 NSString *htmlString = [NSString stringWithCString:html encoding:NSUTF8StringEncoding];
99 NSString *htmlString = [NSString stringWithCString:html encoding:NSUTF8StringEncoding];
100− NSURL *baseURL = [NSURL fileURLWithPath:[[NSString alloc] initWithCString:url encoding:NSUTF8StringEncoding]];
100+ NSURL *baseURL = [NSURL URLWithString:[[NSString alloc] initWithCString:url encoding:NSUTF8StringEncoding]];
101 dispatch_async(dispatch_get_main_queue(), ^{
101 dispatch_async(dispatch_get_main_queue(), ^{
102 [webView loadHTMLString:htmlString baseURL:baseURL];
102 [webView loadHTMLString:htmlString baseURL:baseURL];
103 });
103 });
jsaddle-wkwebview/jsaddle-wkwebview.cabal+14−11
@@ -25,26 +25,29 @@ source-repository head
25library
25library
26 exposed-modules:
26 exposed-modules:
27 Language.Javascript.JSaddle.WKWebView
27 Language.Javascript.JSaddle.WKWebView
28− Language.Javascript.JSaddle.WKWebView.Internal
29 build-depends:
28 build-depends:
30− aeson >=0.8.0.2 && <1.3,
31− base <5,
29+ base <5
32− bytestring >=0.10.6.0 && <0.11,
33− directory,
34− jsaddle >= 0.9.4.0 && <0.10,
35− text,
36− data-default,
37− containers
38 default-language: Haskell2010
30 default-language: Haskell2010
39 hs-source-dirs: src
31 hs-source-dirs: src
40 frameworks: Foundation, WebKit
32 frameworks: Foundation, WebKit
41 ghc-options: -ferror-spans -Wall
33 ghc-options: -ferror-spans -Wall
42− c-sources:
43− cbits/WKWebView.m
44 if impl(ghcjs)
34 if impl(ghcjs)
45 hs-source-dirs: src-ghcjs
35 hs-source-dirs: src-ghcjs
46 else
36 else
37+ build-depends:
38+ aeson >=0.8.0.2 && <1.3,
39+ bytestring >=0.10.6.0 && <0.11,
40+ directory,
41+ jsaddle >= 0.9.4.0 && <0.10,
42+ text,
43+ data-default,
44+ containers
45+ exposed-modules:
46+ Language.Javascript.JSaddle.WKWebView.Internal
47 hs-source-dirs: src-ghc
47 hs-source-dirs: src-ghc
48+ c-sources:
49+ cbits/WKWebView.m
50+ cc-options: -Wno-everything
48 if os(ios)
51 if os(ios)
49 frameworks: UIKit, UserNotifications
52 frameworks: UIKit, UserNotifications
50 if flag(include-app-delegate)
53 if flag(include-app-delegate)
jsaddle-wkwebview/src-ghc/Language/Javascript/JSaddle/WKWebView.hs+29−16
@@ -1,9 +1,12 @@
1module Language.Javascript.JSaddle.WKWebView
1module Language.Javascript.JSaddle.WKWebView
2 ( jsaddleMain
2 ( jsaddleMain
3+ , jsaddleMainHTMLWithBaseURL
3 , jsaddleMainFile
4 , jsaddleMainFile
4 , WKWebView(..)
5 , WKWebView(..)
5 , run
6 , run
7+ , run'
6 , runWithAppConfig
8 , runWithAppConfig
9+ , runHTMLWithBaseURL
7 , runFile
10 , runFile
8 , mainBundleResourcePath
11 , mainBundleResourcePath
9 , AppDelegateConfig (..)
12 , AppDelegateConfig (..)
@@ -17,7 +20,8 @@ import Data.Set (Set)
17import qualified Data.Set as Set
20import qualified Data.Set as Set
18import Data.Word
21import Data.Word
19import Foreign.Marshal.Utils (fromBool)
22import Foreign.Marshal.Utils (fromBool)
20−import Language.Javascript.JSaddle.WKWebView.Internal (jsaddleMain, jsaddleMainFile, WKWebView(..), mainBundleResourcePath)
23+import Language.Javascript.JSaddle.WKWebView.Internal
24+ (jsaddleMain, jsaddleMainHTMLWithBaseURL, jsaddleMainFile, WKWebView(..), mainBundleResourcePath)
21import System.Environment (getProgName)
25import System.Environment (getProgName)
22import Foreign.C.String (CString, withCString)
26import Foreign.C.String (CString, withCString)
23import Foreign.StablePtr (StablePtr, newStablePtr)
27import Foreign.StablePtr (StablePtr, newStablePtr)
@@ -96,29 +100,38 @@ instance Default AppDelegateNotificationConfig where
96
100
97-- | Run JSaddle in a WKWebView
101-- | Run JSaddle in a WKWebView
98run :: JSM () -> IO ()
102run :: JSM () -> IO ()
99−run = run' Nothing def
103+run f = run' def (jsaddleMain f)
100
104
101-- | Run JSaddle in a WKWebView
105-- | Run JSaddle in a WKWebView
102runWithAppConfig :: AppDelegateConfig -> JSM () -> IO ()
106runWithAppConfig :: AppDelegateConfig -> JSM () -> IO ()
103−runWithAppConfig = run' Nothing
107+runWithAppConfig cfg = run' cfg . jsaddleMain
104
108
105-- | Run JSaddle in a WKWebView first loading the specified file
109-- | Run JSaddle in a WKWebView first loading the specified file
106-- from the mainBundle (relative to the resourcePath).
110-- from the mainBundle (relative to the resourcePath).
111+runFile
107−runFile :: ByteString -- ^ The file to navigate to.
112+ :: ByteString -- ^ The file to navigate to.
108− -> ByteString -- ^ The path to allow read access to.
113+ -> ByteString -- ^ The path to allow read access to.
109− -> AppDelegateConfig
114+ -> AppDelegateConfig
110− -> JSM ()
115+ -> JSM ()
111− -> IO ()
116+ -> IO ()
112−runFile url allowing = run' $ Just (url, allowing)
117+runFile url allowing cfg = run' cfg . jsaddleMainFile url allowing
113
118
119+-- | Run JSaddle in a WKWebView first loading the specified html
120+-- as though it came from the specified URL
121+-- (calls WKWebKit function loadHTMLString).
122+runHTMLWithBaseURL
114−run' :: Maybe (ByteString, ByteString)
123+ :: ByteString -- ^ HTML to load.
124+ -> ByteString -- ^ pretend it came from this URL.
115− -> AppDelegateConfig
125+ -> AppDelegateConfig
116− -> JSM ()
126+ -> JSM ()
127+ -> IO ()
128+runHTMLWithBaseURL url allowing cfg = run' cfg . jsaddleMainHTMLWithBaseURL url allowing
129+
130+run' :: AppDelegateConfig
131+ -> (WKWebView -> IO ())
117 -> IO ()
132 -> IO ()
118−run' mUrl cfg f = do
133+run' cfg main = do
119− handler <- case mUrl of
134+ handler <- newStablePtr main
120− Just (url, allowing) -> newStablePtr (jsaddleMainFile url allowing f)
121− Nothing -> newStablePtr (jsaddleMain f)
122 progName <- getProgName
135 progName <- getProgName
123
136
124 -- AppDelegate callbacks
137 -- AppDelegate callbacks
jsaddle-wkwebview/src/Language/Javascript/JSaddle/WKWebView/Internal.hs+12−1
@@ -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+ , jsaddleMainHTMLWithBaseURL
4 , jsaddleMainFile
5 , jsaddleMainFile
5 , WKWebView(..)
6 , WKWebView(..)
6 , mainBundleResourcePath
7 , mainBundleResourcePath
@@ -49,9 +50,19 @@ jsaddleMain :: JSM () -> WKWebView -> IO ()
49jsaddleMain f webView = do
50jsaddleMain f webView = do
50 pwd <- getCurrentDirectory
51 pwd <- getCurrentDirectory
51 let baseURL = encodeUtf8 $ "file://" <> T.pack pwd <> "/index.html"
52 let baseURL = encodeUtf8 $ "file://" <> T.pack pwd <> "/index.html"
53+ jsaddleMainHTMLWithBaseURL (toStrict indexHtml) baseURL f webView
54+
55+-- | Run JSaddle in WKWebView with initial html and base url
56+jsaddleMainHTMLWithBaseURL
57+ :: BS.ByteString -- ^ HTML
58+ -> BS.ByteString -- ^ Base URL
59+ -> JSM ()
60+ -> WKWebView
61+ -> IO ()
62+jsaddleMainHTMLWithBaseURL initialHTML baseURL f webView =
52 jsaddleMain' f webView $
63 jsaddleMain' f webView $
53 useAsCString baseURL $ \url ->
64 useAsCString baseURL $ \url ->
54− useAsCString (toStrict indexHtml) $ \html ->
65+ useAsCString initialHTML $ \html ->
55 loadHTMLStringWithBaseURL webView html url
66 loadHTMLStringWithBaseURL webView html url
56
67
57-- | Run JSaddle in a WKWebView first loading the specified file
68-- | Run JSaddle in a WKWebView first loading the specified file