on master help sign in
Merge pull request #60 from adetokunbo/provide-a-base-url-for-wkwebview
dedf561Hamish Mackenzie
jsaddle-webkit2gtk/src/Language/Javascript/JSaddle/WebKitGTK.hs+1−1
@@ -148,7 +148,7 @@ run main = do
148 void . onWebViewLoadChanged webView $ \case
148 void . onWebViewLoadChanged webView $ \case
149 LoadEventFinished -> runInWebView main webView
149 LoadEventFinished -> runInWebView main webView
150 _ -> return ()
150 _ -> return ()
151− webViewLoadHtml webView "" . Just $ "file://" <> T.pack pwd <> "/"
151+ webViewLoadHtml webView "" . Just $ "file://" <> T.pack pwd <> "/index.html"
152 installQuitHandler webView
152 installQuitHandler webView
153 Gtk.main
153 Gtk.main
154
154
jsaddle-wkwebview/cbits/WKWebView.m+8−10
@@ -61,9 +61,9 @@ extern void jsaddleSyncResult(HsStablePtr, JSaddleHandler *, const char * _Nonnu
61
61
62 if(!navigationAction.targetFrame && ![url.scheme isEqualToString:@"file"]) {
62 if(!navigationAction.targetFrame && ![url.scheme isEqualToString:@"file"]) {
63 if(openApp(url))
63 if(openApp(url))
64− decisionHandler(WKNavigationActionPolicyCancel);
64+ decisionHandler(WKNavigationActionPolicyCancel);
65− else
65+ else
66− decisionHandler(WKNavigationActionPolicyAllow);
66+ decisionHandler(WKNavigationActionPolicyAllow);
67 }
67 }
68 else
68 else
69 decisionHandler(WKNavigationActionPolicyAllow);
69 decisionHandler(WKNavigationActionPolicyAllow);
@@ -95,10 +95,11 @@ void completeSync(JSaddleHandler *handler, const char * _Nonnull s) {
95 handler.completionHandler = NULL;
95 handler.completionHandler = NULL;
96}
96}
97
97
98−void loadHTMLString(WKWebView *webView, const char * _Nonnull html) {
98+void 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− dispatch_async(dispatch_get_main_queue(), ^{
101+ dispatch_async(dispatch_get_main_queue(), ^{
101− [webView loadHTMLString:htmlString baseURL:NULL];
102+ [webView loadHTMLString:htmlString baseURL:baseURL];
102 });
103 });
103}
104}
104
105
@@ -121,6 +122,3 @@ void loadBundleFile(WKWebView *webView, const char * _Nonnull file, const char *
121 }
122 }
122 }
123 }
123}
124}
124−
125−
126−
jsaddle-wkwebview/jsaddle-wkwebview.cabal+2
@@ -30,7 +30,9 @@ library
30 aeson >=0.8.0.2 && <1.3,
30 aeson >=0.8.0.2 && <1.3,
31 base <5,
31 base <5,
32 bytestring >=0.10.6.0 && <0.11,
32 bytestring >=0.10.6.0 && <0.11,
33+ directory,
33 jsaddle >= 0.9.4.0 && <0.10,
34 jsaddle >= 0.9.4.0 && <0.10,
35+ text,
34 data-default,
36 data-default,
35 containers
37 containers
36 default-language: Haskell2010
38 default-language: Haskell2010
jsaddle-wkwebview/src/Language/Javascript/JSaddle/WKWebView/Internal.hs+11−4
@@ -15,6 +15,8 @@ import Data.ByteString (useAsCString, packCString)
15import qualified Data.ByteString as BS (ByteString)
15import qualified Data.ByteString as BS (ByteString)
16import Data.ByteString.Lazy (ByteString, toStrict, fromStrict)
16import Data.ByteString.Lazy (ByteString, toStrict, fromStrict)
17import Data.Aeson (encode, decode)
17import Data.Aeson (encode, decode)
18+import qualified Data.Text as T (pack)
19+import Data.Text.Encoding (encodeUtf8)
18
20
19import Foreign.C.String (CString)
21import Foreign.C.String (CString)
20import Foreign.Ptr (Ptr, nullPtr)
22import Foreign.Ptr (Ptr, nullPtr)
@@ -24,6 +26,8 @@ import Language.Javascript.JSaddle (Results, Batch, JSM)
24import Language.Javascript.JSaddle.Run (runJavaScript)
26import Language.Javascript.JSaddle.Run (runJavaScript)
25import Language.Javascript.JSaddle.Run.Files (initState, runBatch, ghcjsHelpers)
27import Language.Javascript.JSaddle.Run.Files (initState, runBatch, ghcjsHelpers)
26
28
29+import System.Directory (getCurrentDirectory)
30+
27newtype WKWebView = WKWebView (Ptr WKWebView)
31newtype WKWebView = WKWebView (Ptr WKWebView)
28newtype JSaddleHandler = JSaddleHandler (Ptr JSaddleHandler)
32newtype JSaddleHandler = JSaddleHandler (Ptr JSaddleHandler)
29
33
@@ -34,7 +38,7 @@ foreign export ccall callWithWebView :: WKWebView -> StablePtr (WKWebView -> IO
34foreign export ccall callWithCString :: CString -> StablePtr (CString -> IO ()) -> IO ()
38foreign export ccall callWithCString :: CString -> StablePtr (CString -> IO ()) -> IO ()
35foreign export ccall callIO :: StablePtr (IO ()) -> IO ()
39foreign export ccall callIO :: StablePtr (IO ()) -> IO ()
36foreign import ccall addJSaddleHandler :: WKWebView -> StablePtr (IO ()) -> StablePtr (Results -> IO ()) -> StablePtr (Results -> IO Batch) -> IO ()
40foreign 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 ()
38foreign import ccall loadBundleFile :: WKWebView -> CString -> CString -> IO ()
42foreign import ccall loadBundleFile :: WKWebView -> CString -> CString -> IO ()
39foreign import ccall evaluateJavaScript :: WKWebView -> CString -> IO ()
43foreign import ccall evaluateJavaScript :: WKWebView -> CString -> IO ()
40foreign import ccall completeSync :: JSaddleHandler -> CString -> IO ()
44foreign import ccall completeSync :: JSaddleHandler -> CString -> IO ()
@@ -42,9 +46,13 @@ foreign import ccall mainBundleResourcePathC :: IO CString
42
46
43-- | Run JSaddle in WKWebView
47-- | Run JSaddle in WKWebView
44jsaddleMain :: JSM () -> WKWebView -> IO ()
48jsaddleMain :: 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"
46 jsaddleMain' f webView $
52 jsaddleMain' f webView $
53+ useAsCString baseURL $ \url ->
47− useAsCString (toStrict indexHtml) $ loadHTMLString webView
54+ useAsCString (toStrict indexHtml) $ \html ->
55+ loadHTMLStringWithBaseURL webView html url
48
56
49-- | Run JSaddle in a WKWebView first loading the specified file
57-- | Run JSaddle in a WKWebView first loading the specified file
50-- from the mainBundle (relative to the resourcePath).
58-- from the mainBundle (relative to the resourcePath).
@@ -140,4 +148,3 @@ mainBundleResourcePath = do
140 if bs == nullPtr
148 if bs == nullPtr
141 then return Nothing
149 then return Nothing
142 else Just <$> packCString bs
150 else Just <$> packCString bs
143−