on master help sign in
Merge pull request #60 from adetokunbo/provide-a-base-url-for-wkwebview

Provide a file:// url as a base url for wkwebview

commitdedf561122d56d8f32acbcf5a13ee46d54e99671 authorHamish Mackenzie <Hamish.K.Mackenzie@googlemail.com> dateTue 24 Apr 2018, 22:45 (8 years ago) parenta4df40fe2d2b9c
4 files changed+22−15
jsaddle-webkit2gtk/src/Language/Javascript/JSaddle/WebKitGTK.hs+1−1 jsaddle-wkwebview/cbits/WKWebView.m+8−10 jsaddle-wkwebview/jsaddle-wkwebview.cabal+2 jsaddle-wkwebview/src/Language/Javascript/JSaddle/WKWebView/Internal.hs+11−4
jsaddle-webkit2gtk/src/Language/Javascript/JSaddle/WebKitGTK.hs+1−1
@@ -148,7 +148,7 @@ run main = do
148148 void . onWebViewLoadChanged webView $ \case
149149 LoadEventFinished -> runInWebView main webView
150150 _ -> return ()
151− webViewLoadHtml webView "" . Just $ "file://" <> T.pack pwd <> "/"
151+ webViewLoadHtml webView "" . Just $ "file://" <> T.pack pwd <> "/index.html"
152152 installQuitHandler webView
153153 Gtk.main
154154
jsaddle-wkwebview/cbits/WKWebView.m+8−10
@@ -61,9 +61,9 @@ extern void jsaddleSyncResult(HsStablePtr, JSaddleHandler *, const char * _Nonnu
6161
6262 if(!navigationAction.targetFrame && ![url.scheme isEqualToString:@"file"]) {
6363 if(openApp(url))
64− decisionHandler(WKNavigationActionPolicyCancel);
65− else
66− decisionHandler(WKNavigationActionPolicyAllow);
64+ decisionHandler(WKNavigationActionPolicyCancel);
65+ else
66+ decisionHandler(WKNavigationActionPolicyAllow);
6767 }
6868 else
6969 decisionHandler(WKNavigationActionPolicyAllow);
@@ -95,10 +95,11 @@ void completeSync(JSaddleHandler *handler, const char * _Nonnull s) {
9595 handler.completionHandler = NULL;
9696}
9797
98−void loadHTMLString(WKWebView *webView, const char * _Nonnull html) {
99− NSString *htmlString = [NSString stringWithCString:html encoding:NSUTF8StringEncoding];
100− dispatch_async(dispatch_get_main_queue(), ^{
101− [webView loadHTMLString:htmlString baseURL:NULL];
98+void loadHTMLStringWithBaseURL(WKWebView *webView, const char * _Nonnull html, const char * _Nonnull url) {
99+ NSString *htmlString = [NSString stringWithCString:html encoding:NSUTF8StringEncoding];
100+ NSURL *baseURL = [NSURL fileURLWithPath:[[NSString alloc] initWithCString:url encoding:NSUTF8StringEncoding]];
101+ dispatch_async(dispatch_get_main_queue(), ^{
102+ [webView loadHTMLString:htmlString baseURL:baseURL];
102103 });
103104}
104105
@@ -121,6 +122,3 @@ void loadBundleFile(WKWebView *webView, const char * _Nonnull file, const char *
121122 }
122123 }
123124}
124−
125−
126−
jsaddle-wkwebview/jsaddle-wkwebview.cabal+2
@@ -30,7 +30,9 @@ library
3030 aeson >=0.8.0.2 && <1.3,
3131 base <5,
3232 bytestring >=0.10.6.0 && <0.11,
33+ directory,
3334 jsaddle >= 0.9.4.0 && <0.10,
35+ text,
3436 data-default,
3537 containers
3638 default-language: Haskell2010
jsaddle-wkwebview/src/Language/Javascript/JSaddle/WKWebView/Internal.hs+11−4
@@ -15,6 +15,8 @@ import Data.ByteString (useAsCString, packCString)
1515import qualified Data.ByteString as BS (ByteString)
1616import Data.ByteString.Lazy (ByteString, toStrict, fromStrict)
1717import Data.Aeson (encode, decode)
18+import qualified Data.Text as T (pack)
19+import Data.Text.Encoding (encodeUtf8)
1820
1921import Foreign.C.String (CString)
2022import Foreign.Ptr (Ptr, nullPtr)
@@ -24,6 +26,8 @@ import Language.Javascript.JSaddle (Results, Batch, JSM)
2426import Language.Javascript.JSaddle.Run (runJavaScript)
2527import Language.Javascript.JSaddle.Run.Files (initState, runBatch, ghcjsHelpers)
2628
29+import System.Directory (getCurrentDirectory)
30+
2731newtype WKWebView = WKWebView (Ptr WKWebView)
2832newtype JSaddleHandler = JSaddleHandler (Ptr JSaddleHandler)
2933
@@ -34,7 +38,7 @@ foreign export ccall callWithWebView :: WKWebView -> StablePtr (WKWebView -> IO
3438foreign export ccall callWithCString :: CString -> StablePtr (CString -> IO ()) -> IO ()
3539foreign export ccall callIO :: StablePtr (IO ()) -> IO ()
3640foreign import ccall addJSaddleHandler :: WKWebView -> StablePtr (IO ()) -> StablePtr (Results -> IO ()) -> StablePtr (Results -> IO Batch) -> IO ()
37−foreign import ccall loadHTMLString :: WKWebView -> CString -> IO ()
41+foreign import ccall loadHTMLStringWithBaseURL :: WKWebView -> CString -> CString -> IO ()
3842foreign import ccall loadBundleFile :: WKWebView -> CString -> CString -> IO ()
3943foreign import ccall evaluateJavaScript :: WKWebView -> CString -> IO ()
4044foreign import ccall completeSync :: JSaddleHandler -> CString -> IO ()
@@ -42,9 +46,13 @@ foreign import ccall mainBundleResourcePathC :: IO CString
4246
4347-- | Run JSaddle in WKWebView
4448jsaddleMain :: JSM () -> WKWebView -> IO ()
45−jsaddleMain f webView =
49+jsaddleMain f webView = do
50+ pwd <- getCurrentDirectory
51+ let baseURL = encodeUtf8 $ "file://" <> T.pack pwd <> "/index.html"
4652 jsaddleMain' f webView $
47− useAsCString (toStrict indexHtml) $ loadHTMLString webView
53+ useAsCString baseURL $ \url ->
54+ useAsCString (toStrict indexHtml) $ \html ->
55+ loadHTMLStringWithBaseURL webView html url
4856
4957-- | Run JSaddle in a WKWebView first loading the specified file
5058-- from the mainBundle (relative to the resourcePath).
@@ -140,4 +148,3 @@ mainBundleResourcePath = do
140148 if bs == nullPtr
141149 then return Nothing
142150 else Just <$> packCString bs
143−