-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMainWindowViewModel.cs
83 lines (69 loc) · 2.8 KB
/
MainWindowViewModel.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
////////////////////////////////////////////////////////////////////////////
//
// DupeNukem - WebView attachable full-duplex asynchronous interoperable
// independent messaging library between .NET and JavaScript.
//
// Copyright (c) Kouji Matsui (@kozy_kekyo, @kekyo@mastodon.cloud)
//
// Licensed under Apache-v2: https://opensource.org/licenses/Apache-2.0
//
////////////////////////////////////////////////////////////////////////////
using Epoxy;
using System;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Threading;
namespace DupeNukem.ViewModels;
[ViewModel] // PropChanged injection by Epoxy
internal sealed partial class MainWindowViewModel
{
public Command Loaded { get; }
public Uri? Url { get; private set; }
public Pile<Microsoft.Web.WebView2.Wpf.WebView2> WebView2Pile { get; } =
Pile.Factory.Create<Microsoft.Web.WebView2.Wpf.WebView2>();
public MainWindowViewModel()
{
// Step 1: Construct DupeNukem Messenger.
var messenger = new WebViewMessenger();
HookWithMessengerTestCode(messenger); // FOR TEST
// ----
// MainWindow.Loaded:
this.Loaded = Command.Factory.Create<EventArgs>(async _ =>
{
await this.WebView2Pile.RentAsync(async webView2 =>
{
// Startup sequence.
// Bound between WebView2 and DupeNukem Messenger.
// Initialize WebView2.
await webView2.EnsureCoreWebView2Async();
// Step 2: Hook up .NET --> JavaScript message handler.
messenger.SendRequest += (s, e) =>
webView2.CoreWebView2.PostWebMessageAsString(e.JsonString);
// Step 3: Attached JavaScript --> .NET message handler.
webView2.CoreWebView2.WebMessageReceived += (s, e) =>
{
if (messenger.Serializer.Deserialize(
new StringReader(e.WebMessageAsJson),
typeof(object))?.ToString() is { } m)
{
messenger.ReceivedRequest(m);
}
};
// Step 4: Injected Messenger script.
var script = messenger.GetInjectionScript(true);
AddJavaScriptTestCode(script); // FOR TEST
await webView2.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(
script.ToString());
// Enable dev tools.
webView2.CoreWebView2.OpenDevToolsWindow();
// Register test objects.
this.RegisterTestObjects(messenger);
});
this.Url = new Uri("https://www.google.com/");
});
}
}