#include "HsFFI.h" #import #import extern void jsaddleStart(HsStablePtr); extern void jsaddleResult(HsStablePtr, const char * _Nonnull result); @interface JSaddleHandler : NSObject @property (nonatomic, assign) HsStablePtr startHandler; @property (nonatomic, assign) HsStablePtr resultHandler; - (instancetype)initHandler:(HsStablePtr)startHandler resultHandler:(HsStablePtr)resultHandler; @end @implementation JSaddleHandler - (instancetype)initHandler:(HsStablePtr)startHandler resultHandler:(HsStablePtr)resultHandler { self = [super init]; if (self) { _startHandler = startHandler; _resultHandler = resultHandler; } return self; } - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { jsaddleStart(self.startHandler); } - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { NSString * s = (NSString *) message.body; jsaddleResult(self.resultHandler, [s UTF8String]); } @end void addJSaddleHandler(WKWebView *webView, HsStablePtr startHandler, HsStablePtr resultHandler) { JSaddleHandler * handler = [[JSaddleHandler alloc] initHandler:startHandler resultHandler:resultHandler]; [[[webView configuration] userContentController] addScriptMessageHandler:handler name:@"jsaddle"]; webView.navigationDelegate = handler; } void evaluateJavaScript(WKWebView *webView, const char * _Nonnull js) { [webView evaluateJavaScript:[NSString stringWithCString:js encoding:NSUTF8StringEncoding] completionHandler:NULL]; } void loadHTMLString(WKWebView *webView, const char * _Nonnull html) { [webView loadHTMLString:[NSString stringWithCString:html encoding:NSUTF8StringEncoding] baseURL:NULL]; }