implement ui_webview_load_content (Cocoa)

Sun, 26 Oct 2025 10:30:02 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 26 Oct 2025 10:30:02 +0100
changeset 876
2131c806440d
parent 875
0575ca45f1bb
child 877
aff9ad6a54a1

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) {

mercurial