implement webview zoom setting (Cocoa)

Mon, 27 Oct 2025 16:48:39 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 27 Oct 2025 16:48:39 +0100
changeset 878
862a57990eb8
parent 877
aff9ad6a54a1
child 879
d3acaa5fc3d8

implement webview zoom setting (Cocoa)

ui/cocoa/webview.m file | annotate | diff | comparison | revisions
--- a/ui/cocoa/webview.m	Sun Oct 26 13:10:46 2025 +0100
+++ b/ui/cocoa/webview.m	Mon Oct 27 16:48:39 2025 +0100
@@ -30,12 +30,13 @@
 #import "Container.h"
 
 UIWIDGET ui_webview_create(UiObject *obj, UiWebviewArgs *args) {
+    UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_GENERIC);
+    
     WKWebView *webview = [[WKWebView alloc]init];
     
     UiLayout layout = UI_ARGS2LAYOUT(args);
     ui_container_add(obj, webview, &layout);
     
-    UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_GENERIC);
     if(var) {
         UiGeneric *value = var->value;
         value->get = ui_webview_get;
@@ -61,6 +62,8 @@
 UiWebViewData* ui_webview_data_clone(UiWebViewData *data) {
     UiWebViewData *newdata = malloc(sizeof(UiWebViewData));
     memset(newdata, 0, sizeof(UiWebViewData));
+    newdata->zoom = 1;
+    newdata->javascript = TRUE;
     
     if(data) {
         newdata->uri = data->uri ? strdup(data->uri) : NULL;
@@ -98,6 +101,7 @@
     if(data->type == WEBVIEW_CONTENT_URL) {
         (void)ui_webview_get_uri(g); // this updates data->uri
     }
+    data->zoom = webview.pageZoom;
     
     return ui_webview_data_clone(g->value);
 }
@@ -118,18 +122,29 @@
     
     WKWebView *webview = (__bridge WKWebView*)g->obj;
     UiWebViewData *webd = data;
-    if(webd->type == WEBVIEW_CONTENT_URL && webd->uri) {
-        NSURL *url = [NSURL URLWithString:[[NSString alloc] initWithUTF8String:webd->uri]];
+    if(webd->type == WEBVIEW_CONTENT_URL) {
+        const char *uri = webd->uri ? webd->uri : "about:blank";
+        NSURL *url = [NSURL URLWithString:[[NSString alloc] initWithUTF8String:uri]];
         if(url) {
             NSURLRequest *req = [NSURLRequest requestWithURL:url];
             if(req) {
                 [webview loadRequest:req];
             }
         }
-    } else if(webd->content) {
-        // TODO
+    } else {
+        NSString *mimetype = [[NSString alloc]initWithUTF8String: webd->mimetype ? webd->mimetype : "text/plain"];
+        NSString *encoding = [[NSString alloc]initWithUTF8String: webd->encoding ? webd->encoding : "UTF-8"];
+        NSString *urlStr = [[NSString alloc]initWithUTF8String: webd->uri ? webd->uri : "file:///"];
+        NSURL *url = [NSURL URLWithString:urlStr];
+        NSData *content = [NSData dataWithBytes:webd->content length:webd->contentlength];
+        if(!url) {
+            url = [NSURL URLWithString:@"about:blank"];
+        }
+        [webview loadData:content MIMEType:mimetype characterEncodingName:encoding baseURL:url];
     }
     
+    webview.pageZoom = webd->zoom;
+    
     return 1;
 }
 
@@ -145,7 +160,7 @@
     data->type = WEBVIEW_CONTENT_URL;
     
     if(!url) {
-        url = "abount:blank";
+        url = "about:blank";
     }
     
     NSURL *nsurl = [NSURL URLWithString:[[NSString alloc] initWithUTF8String:url]];
@@ -244,13 +259,15 @@
 }
 
 void ui_webview_enable_javascript(UiGeneric *g, UiBool enable) {
-    
+    // unsupported
 }
 
 void ui_webview_set_zoom(UiGeneric *g, double zoom) {
-    
+    WKWebView *webview = (__bridge WKWebView*)g->obj;
+    webview.pageZoom = zoom;
 }
 
 double ui_webview_get_zoom(UiGeneric *g) {
-    return 0;
+    WKWebView *webview = (__bridge WKWebView*)g->obj;
+    return webview.pageZoom;
 }

mercurial