|
1 |
| -function HybridWebViewInit() |
2 |
| -{ |
3 |
| - function DispatchHybridWebViewMessage(message) { |
4 |
| - const event = new CustomEvent("HybridWebViewMessageReceived", { detail: { message: message } }); |
5 |
| - window.dispatchEvent(event); |
6 |
| - } |
| 1 | +window.HybridWebView = { |
| 2 | + "Init": function () { |
| 3 | + function DispatchHybridWebViewMessage(message) { |
| 4 | + const event = new CustomEvent("HybridWebViewMessageReceived", { detail: { message: message } }); |
| 5 | + window.dispatchEvent(event); |
| 6 | + } |
7 | 7 |
|
8 |
| - if (window.chrome && window.chrome.webview) { |
9 |
| - // Windows WebView2 |
10 |
| - window.chrome.webview.addEventListener('message', arg => { |
11 |
| - DispatchHybridWebViewMessage(arg.data); |
12 |
| - }); |
13 |
| - } |
14 |
| - else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.webwindowinterop) { |
15 |
| - // iOS and MacCatalyst WKWebView |
16 |
| - window.external = { |
17 |
| - "receiveMessage": message => { |
18 |
| - DispatchHybridWebViewMessage(message); |
19 |
| - } |
20 |
| - }; |
21 |
| - } |
22 |
| - else { |
23 |
| - // Android WebView |
24 |
| - window.addEventListener('message', arg => { |
25 |
| - DispatchHybridWebViewMessage(arg.data); |
26 |
| - }); |
27 |
| - } |
28 |
| -} |
| 8 | + if (window.chrome && window.chrome.webview) { |
| 9 | + // Windows WebView2 |
| 10 | + window.chrome.webview.addEventListener('message', arg => { |
| 11 | + DispatchHybridWebViewMessage(arg.data); |
| 12 | + }); |
| 13 | + } |
| 14 | + else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.webwindowinterop) { |
| 15 | + // iOS and MacCatalyst WKWebView |
| 16 | + window.external = { |
| 17 | + "receiveMessage": message => { |
| 18 | + DispatchHybridWebViewMessage(message); |
| 19 | + } |
| 20 | + }; |
| 21 | + } |
| 22 | + else { |
| 23 | + // Android WebView |
| 24 | + window.addEventListener('message', arg => { |
| 25 | + DispatchHybridWebViewMessage(arg.data); |
| 26 | + }); |
| 27 | + } |
| 28 | + }, |
29 | 29 |
|
30 |
| -window.HybridWebView = |
31 |
| -{ |
32 | 30 | "SendRawMessage": function (message) {
|
| 31 | + window.HybridWebView.__SendMessageInternal('RawMessage', message); |
| 32 | + }, |
| 33 | + |
| 34 | + "__SendMessageInternal": function (type, message) { |
| 35 | + |
| 36 | + const messageToSend = type + '|' + message; |
33 | 37 |
|
34 | 38 | if (window.chrome && window.chrome.webview) {
|
35 | 39 | // Windows WebView2
|
36 |
| - window.chrome.webview.postMessage(message); |
| 40 | + window.chrome.webview.postMessage(messageToSend); |
37 | 41 | }
|
38 | 42 | else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.webwindowinterop) {
|
39 | 43 | // iOS and MacCatalyst WKWebView
|
40 |
| - window.webkit.messageHandlers.webwindowinterop.postMessage(message); |
| 44 | + window.webkit.messageHandlers.webwindowinterop.postMessage(messageToSend); |
41 | 45 | }
|
42 | 46 | else {
|
43 | 47 | // Android WebView
|
44 |
| - hybridWebViewHost.sendRawMessage(message); |
| 48 | + hybridWebViewHost.sendMessage(messageToSend); |
45 | 49 | }
|
| 50 | + }, |
| 51 | + |
| 52 | + "InvokeMethod": function (taskId, methodName, args) { |
| 53 | + if (methodName[Symbol.toStringTag] === 'AsyncFunction') { |
| 54 | + // For async methods, we need to call the method and then trigger the callback when it's done |
| 55 | + const asyncPromise = methodName(...args); |
| 56 | + asyncPromise |
| 57 | + .then(asyncResult => { |
| 58 | + window.HybridWebView.__TriggerAsyncCallback(taskId, asyncResult); |
| 59 | + }) |
| 60 | + .catch(error => console.error(error)); |
| 61 | + } else { |
| 62 | + // For sync methods, we can call the method and trigger the callback immediately |
| 63 | + const syncResult = methodName(...args); |
| 64 | + window.HybridWebView.__TriggerAsyncCallback(taskId, syncResult); |
| 65 | + } |
| 66 | + }, |
| 67 | + |
| 68 | + "__TriggerAsyncCallback": function (taskId, result) { |
| 69 | + // Make sure the result is a string |
| 70 | + if (result && typeof (result) !== 'string') { |
| 71 | + result = JSON.stringify(result); |
| 72 | + } |
| 73 | + |
| 74 | + window.HybridWebView.__SendMessageInternal('InvokeMethodCompleted', taskId + '|' + result); |
46 | 75 | }
|
47 | 76 | }
|
48 | 77 |
|
49 |
| -HybridWebViewInit(); |
| 78 | +window.HybridWebView.Init(); |
0 commit comments