// This is free and unencumbered software released into the public domain. // Happy coding!!! - GtkSharp Team using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using Atk; using Gdk; using Gtk; using WebKit; using IAsyncResult = GLib.IAsyncResult; using Object = GLib.Object; namespace Samples { [Section(ContentType = typeof(WebView), Category = Category.Widgets)] class WebviewSection : ListSection { public WebviewSection() { if (!WebKit.Global.IsSupported) { AddItem(($"{nameof(WebKit.WebView)}", new Label($"{typeof(WebView).Namespace} is not suported on your OS"))); return; } AddItem(ShowHtml()); AddItem(ShowJavaScript()); AddItem(ShowUri()); } public (string, Widget) ShowHtml() { var webView = new WebView { HeightRequest = 100, WidthRequest = 400, Hexpand = true }; webView.LoadHtml($"This is a {nameof(WebView)} showing html text"); return ($"{nameof(WebView)} show html text:", webView); } public (string, Widget) ShowJavaScript() { var webView = new WebView { HeightRequest = 100, WidthRequest = 400, Hexpand = true }; webView.Settings.EnableDeveloperExtras = true; var userContentManager = webView.UserContentManager; var messageHandlerName = "gtksharp"; var script = new UserScript( source: $"function testFunc() {{\n" + $"window.webkit.messageHandlers.{messageHandlerName}.postMessage(\"postMessage\");\n" + $"return 'Success' }};\n", UserContentInjectedFrames.AllFrames, UserScriptInjectionTime.Start, null, null); userContentManager.AddScript(script); var buttonClickPostMessage = $"var button = document.getElementById(\"clickMeButton\");\n" + $"button.addEventListener(\"click\", " + $"function() {{varmessageToPost = {{'ButtonId':'clickMeButton'}};\n" + $"window.webkit.messageHandlers.{messageHandlerName}.postMessage(\"clickMeButton clicked\");\n}},false);"; var script2 = new UserScript( source: buttonClickPostMessage, UserContentInjectedFrames.AllFrames, UserScriptInjectionTime.End, null, null); userContentManager.AddScript(script2); userContentManager.RegisterScriptMessageHandler(messageHandlerName); userContentManager.ScriptMessageReceived += (o, args) => { var value = args.JsResult?.JsValue; if (value is { IsString: true } v) ApplicationOutput.WriteLine($"{nameof(userContentManager.ScriptMessageReceived)}:\t{nameof(JavascriptResult.JsValue)}\t{v?.ToString()}"); }; webView.LoadHtml($"This is a {nameof(WebView)} with {nameof(UserScript)}" + "
Send message "); webView.LoadChanged += (s, e) => { ApplicationOutput.WriteLine(s, $"{e.LoadEvent}"); if (e.LoadEvent != LoadEvent.Finished) return; webView.RunJavascript("testFunc()", null, HandleJavaScriptResult); }; void HandleJavaScriptResult(object source_object, IAsyncResult res) { if (source_object is not WebView view) return; try { JavascriptResult js_result = view.RunJavascriptFinish(res); if (js_result.JsValue is { } jsValue) { if (jsValue.IsString) { ApplicationOutput.WriteLine($"{nameof(webView.RunJavascriptFinish)}:\t{nameof(JavascriptResult.JsValue)}\t{jsValue.ToString()}"); } } } catch (Exception exception) { ApplicationOutput.WriteLine($"{nameof(webView.RunJavascriptFinish)} throws:\n{exception.Message}"); } } return ($"{nameof(WebView)} with {nameof(UserScript)}:", webView); } public (string, Widget) ShowUri() { var webView = new WebView { WidthRequest = 400, Vexpand = true, Hexpand = true, }; webView.LoadUri("https://github.com/GtkSharp/GtkSharp#readme"); return ($"{nameof(WebView)} show uri:", webView); } } }