Sun, 26 Oct 2025 10:30:02 +0100
implement ui_webview_load_content (Cocoa)
| ui/cocoa/webview.h | file | annotate | diff | comparison | revisions | |
| ui/cocoa/webview.m | file | annotate | diff | comparison | revisions |
--- a/ui/cocoa/webview.h Sun Oct 26 10:07:31 2025 +0100 +++ b/ui/cocoa/webview.h Sun Oct 26 10:30:02 2025 +0100 @@ -37,7 +37,7 @@ WEBVIEW_CONTENT_CONTENT }; -typedef struct UiWebViewData { +struct UiWebViewData { void *webview; char *uri; char *mimetype; @@ -48,7 +48,7 @@ double zoom; UiBool javascript; -} UiWebViewData; +}; UiWebViewData* ui_webview_data_clone(UiWebViewData *data);
--- a/ui/cocoa/webview.m Sun Oct 26 10:07:31 2025 +0100 +++ b/ui/cocoa/webview.m Sun Oct 26 10:30:02 2025 +0100 @@ -92,6 +92,13 @@ } void* ui_webview_get(UiGeneric *g) { + UiWebViewData *data = g->value; + WKWebView *webview = (__bridge WKWebView*)g->obj; + + if(data->type == WEBVIEW_CONTENT_URL) { + (void)ui_webview_get_uri(g); // this updates data->uri + } + return ui_webview_data_clone(g->value); } @@ -134,13 +141,18 @@ void ui_webview_load_url(UiGeneric *g, const char *url) { WKWebView *webview = (__bridge WKWebView*)g->obj; - if(url) { - NSURL *nsurl = [NSURL URLWithString:[[NSString alloc] initWithUTF8String:url]]; - if(nsurl) { - NSURLRequest *req = [NSURLRequest requestWithURL:nsurl]; - if(req) { - [webview loadRequest:req]; - } + UiWebViewData *data = g->value; + data->type = WEBVIEW_CONTENT_URL; + + if(!url) { + url = "abount:blank"; + } + + NSURL *nsurl = [NSURL URLWithString:[[NSString alloc] initWithUTF8String:url]]; + if(nsurl) { + NSURLRequest *req = [NSURLRequest requestWithURL:nsurl]; + if(req) { + [webview loadRequest:req]; } } } @@ -153,12 +165,49 @@ const char *mimetype, const char *encoding) { + UiWebViewData *data = g->value; + WKWebView *webview = (__bridge WKWebView*)g->obj; + data->type = WEBVIEW_CONTENT_CONTENT; + + free(data->uri); + data->uri = NULL; + free(data->mimetype); + free(data->encoding); + free(data->content); + data->type = WEBVIEW_CONTENT_URL; + + data->content = malloc(contentlength+1); + memcpy(data->content, content, contentlength); + data->content[contentlength] = 0; + + if(!mimetype) { + mimetype = "text/plain"; + } + if(!encoding) { + encoding = "UTF-8"; + } + + data->mimetype = strdup(mimetype); + data->encoding = strdup(encoding); + + NSString *mtype = [[NSString alloc]initWithUTF8String:mimetype]; + NSString *enc = [[NSString alloc]initWithUTF8String:encoding]; + NSData *ct = [NSData dataWithBytes:content length:contentlength]; + NSURL *url; + if(uri) { + NSString *uriStr = [[NSString alloc]initWithUTF8String:uri]; + url = [NSURL URLWithString:uriStr]; + } else { + url = [NSURL URLWithString:@"file:///"]; + } + [webview loadData:ct MIMEType:mtype characterEncodingName:enc baseURL:url]; } void ui_webview_reload(UiGeneric *g) { - + WKWebView *webview = (__bridge WKWebView*)g->obj; + [webview reload]; } UiBool ui_webview_can_go_back(UiGeneric *g) { @@ -178,7 +227,20 @@ } const char * ui_webview_get_uri(UiGeneric *g) { - return NULL; + UiWebViewData *data = g->value; + WKWebView *webview = (__bridge WKWebView*)g->obj; + + free(data->uri); + data->uri = NULL; + + NSURL *url = webview.URL; + if(url) { + NSString *s = [url absoluteString]; + if(s) { + data->uri = strdup(s.UTF8String); + } + } + return data->uri; } void ui_webview_enable_javascript(UiGeneric *g, UiBool enable) {