Skip to content

Commit 3709c09

Browse files
committed
refactor: update vuplex webviews to follow recommended message handling
1 parent 9afcd4b commit 3709c09

File tree

4 files changed

+77
-53
lines changed

4 files changed

+77
-53
lines changed

src/Packages/Passport/Runtime/Scripts/Private/UI/AndroidVuplexWebView.cs

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -95,31 +95,40 @@ private async UniTaskVoid InitializeAsync(PassportWebViewConfig config)
9595
await _webViewPrefab.WaitUntilInitialized();
9696

9797
// Setup event handlers
98-
_webViewPrefab.WebView.LoadProgressChanged += (s, e) =>
98+
_webViewPrefab.WebView.LoadProgressChanged += (sender, progressArgs) =>
9999
{
100-
if (e.Type == ProgressChangeType.Started)
100+
if (progressArgs.Type == ProgressChangeType.Started)
101101
{
102102
OnLoadStarted?.Invoke();
103103
}
104-
else if (e.Type == ProgressChangeType.Finished)
104+
else if (progressArgs.Type == ProgressChangeType.Finished)
105105
{
106106
OnLoadFinished?.Invoke();
107107
}
108108
};
109-
_webViewPrefab.WebView.MessageEmitted += (s, e) =>
109+
_webViewPrefab.WebView.MessageEmitted += (sender, messageArgs) =>
110110
{
111-
foreach (var h in _jsHandlers)
111+
try
112112
{
113-
if (e.Value.StartsWith($"{h.Key}:"))
113+
// Parse the JSON message from window.vuplex.postMessage()
114+
var message = JsonUtility.FromJson<VuplexMessage>(messageArgs.Value);
115+
116+
if (_jsHandlers.ContainsKey(message.method))
114117
{
115-
h.Value?.Invoke(e.Value.Substring(h.Key.Length + 1));
118+
_jsHandlers[message.method]?.Invoke(message.data);
116119
return;
117120
}
118-
}
119121

120-
OnJavaScriptMessage?.Invoke(e.Value);
122+
PassportLogger.Warn($"{TAG} No handler registered for method: {message.method}");
123+
}
124+
catch (Exception ex)
125+
{
126+
PassportLogger.Error($"{TAG} Failed to parse Vuplex message: {ex.Message}, Raw message: {messageArgs.Value}");
127+
// Fallback to raw message for backwards compatibility
128+
OnJavaScriptMessage?.Invoke(messageArgs.Value);
129+
}
121130
};
122-
_webViewPrefab.WebView.LoadFailed += (s, e) => PassportLogger.Warn($"{TAG} Load failed: {e.NativeErrorCode} for {e.Url}");
131+
_webViewPrefab.WebView.LoadFailed += (sender, failedArgs) => PassportLogger.Warn($"{TAG} Load failed: {failedArgs.NativeErrorCode} for {failedArgs.Url}");
123132

124133
_isInitialized = true;
125134
PassportLogger.Info($"{TAG} Vuplex WebView initialized successfully");
@@ -183,13 +192,10 @@ public void ExecuteJavaScript(string js)
183192
public void RegisterJavaScriptMethod(string methodName, Action<string> handler)
184193
{
185194
_jsHandlers[methodName] = handler;
195+
PassportLogger.Info($"{TAG} JavaScript method '{methodName}' registered for Vuplex message handling");
186196

187-
#if UNITY_ANDROID && !UNITY_EDITOR
188-
if (_isInitialized && _webViewPrefab?.WebView != null)
189-
{
190-
ExecuteJavaScript($"window.{methodName}=d=>window.vuplex?.postMessage('{methodName}:'+(typeof d==='object'?JSON.stringify(d):d))");
191-
}
192-
#endif
197+
// Note: No JavaScript injection needed with Vuplex - web page should call:
198+
// window.vuplex.postMessage({method: 'methodName', data: 'jsonData'})
193199
}
194200

195201
public void Dispose()

src/Packages/Passport/Runtime/Scripts/Private/UI/IPassportWebView.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
namespace Immutable.Passport
44
{
5+
/// <summary>
6+
/// Message structure for Vuplex WebView communication
7+
/// Matches the JSON format: {method: "MethodName", data: "..."}
8+
/// </summary>
9+
[System.Serializable]
10+
public class VuplexMessage
11+
{
12+
public string method;
13+
public string data;
14+
}
515
/// <summary>
616
/// Platform abstraction interface for PassportUI WebView implementations.
717
/// Provides a unified API for different WebView technologies across platforms:

src/Packages/Passport/Runtime/Scripts/Private/UI/MacOSPassportWebView.cs

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -99,31 +99,40 @@ private async UniTaskVoid InitializeAsync(PassportWebViewConfig config)
9999
await _webViewPrefab.WaitUntilInitialized();
100100

101101
// Setup event handlers
102-
_webViewPrefab.WebView.LoadProgressChanged += (s, e) =>
102+
_webViewPrefab.WebView.LoadProgressChanged += (sender, progressArgs) =>
103103
{
104-
if (e.Type == ProgressChangeType.Started)
104+
if (progressArgs.Type == ProgressChangeType.Started)
105105
{
106106
OnLoadStarted?.Invoke();
107107
}
108-
else if (e.Type == ProgressChangeType.Finished)
108+
else if (progressArgs.Type == ProgressChangeType.Finished)
109109
{
110110
OnLoadFinished?.Invoke();
111111
}
112112
};
113-
_webViewPrefab.WebView.MessageEmitted += (s, e) =>
113+
_webViewPrefab.WebView.MessageEmitted += (sender, messageArgs) =>
114114
{
115-
foreach (var h in _jsHandlers)
115+
try
116116
{
117-
if (e.Value.StartsWith($"{h.Key}:"))
117+
// Parse the JSON message from window.vuplex.postMessage()
118+
var message = JsonUtility.FromJson<VuplexMessage>(messageArgs.Value);
119+
120+
if (_jsHandlers.ContainsKey(message.method))
118121
{
119-
h.Value?.Invoke(e.Value.Substring(h.Key.Length + 1));
122+
_jsHandlers[message.method]?.Invoke(message.data);
120123
return;
121124
}
122-
}
123125

124-
OnJavaScriptMessage?.Invoke(e.Value);
126+
PassportLogger.Warn($"{TAG} No handler registered for method: {message.method}");
127+
}
128+
catch (Exception ex)
129+
{
130+
PassportLogger.Error($"{TAG} Failed to parse Vuplex message: {ex.Message}, Raw message: {messageArgs.Value}");
131+
// Fallback to raw message for backwards compatibility
132+
OnJavaScriptMessage?.Invoke(messageArgs.Value);
133+
}
125134
};
126-
_webViewPrefab.WebView.LoadFailed += (s, e) => PassportLogger.Warn($"{TAG} Load failed: {e.NativeErrorCode} for {e.Url}");
135+
_webViewPrefab.WebView.LoadFailed += (sender, failedArgs) => PassportLogger.Warn($"{TAG} Load failed: {failedArgs.NativeErrorCode} for {failedArgs.Url}");
127136

128137
_isInitialized = true;
129138
PassportLogger.Info($"{TAG} MacOS WebView initialized successfully");
@@ -196,17 +205,10 @@ public void ExecuteJavaScript(string js)
196205
public void RegisterJavaScriptMethod(string methodName, Action<string> handler)
197206
{
198207
_jsHandlers[methodName] = handler;
199-
PassportLogger.Info($"{TAG} JavaScript method '{methodName}' registered");
208+
PassportLogger.Info($"{TAG} JavaScript method '{methodName}' registered for Vuplex message handling");
200209

201-
#if UNITY_STANDALONE_OSX && !UNITY_EDITOR
202-
if (_isInitialized && _webViewPrefab?.WebView != null)
203-
{
204-
// Register the method with Vuplex WebView using window.vuplex.postMessage
205-
string jsCode = $"window.{methodName}=d=>window.vuplex?.postMessage('{methodName}:'+(typeof d==='object'?JSON.stringify(d):d))";
206-
ExecuteJavaScript(jsCode);
207-
PassportLogger.Info($"{TAG} JavaScript method '{methodName}' registered with Vuplex");
208-
}
209-
#endif
210+
// Note: No JavaScript injection needed with Vuplex - web page should call:
211+
// window.vuplex.postMessage({method: 'methodName', data: 'jsonData'})
210212
}
211213

212214
public void Dispose()

src/Packages/Passport/Runtime/Scripts/Private/UI/iOSPassportWebView.cs

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ private async UniTaskVoid InitializeAsync(PassportWebViewConfig config)
8181
// Create WebView prefab and parent to Canvas
8282
_webViewPrefab = CanvasWebViewPrefab.Instantiate();
8383
_webViewPrefab.Native2DModeEnabled = false; // Disable Native2DMode to avoid Unity integration issues
84-
84+
8585
// Set reasonable resolution - much lower to avoid texture size issues
8686
_webViewPrefab.Resolution = 1.0f; // 1px per Unity unit - creates 800x600px texture
8787

@@ -99,31 +99,40 @@ private async UniTaskVoid InitializeAsync(PassportWebViewConfig config)
9999
await _webViewPrefab.WaitUntilInitialized();
100100

101101
// Setup event handlers
102-
_webViewPrefab.WebView.LoadProgressChanged += (s, e) =>
102+
_webViewPrefab.WebView.LoadProgressChanged += (sender, progressArgs) =>
103103
{
104-
if (e.Type == ProgressChangeType.Started)
104+
if (progressArgs.Type == ProgressChangeType.Started)
105105
{
106106
OnLoadStarted?.Invoke();
107107
}
108-
else if (e.Type == ProgressChangeType.Finished)
108+
else if (progressArgs.Type == ProgressChangeType.Finished)
109109
{
110110
OnLoadFinished?.Invoke();
111111
}
112112
};
113-
_webViewPrefab.WebView.MessageEmitted += (s, e) =>
113+
_webViewPrefab.WebView.MessageEmitted += (sender, messageArgs) =>
114114
{
115-
foreach (var h in _jsHandlers)
115+
try
116116
{
117-
if (e.Value.StartsWith($"{h.Key}:"))
117+
// Parse the JSON message from window.vuplex.postMessage()
118+
var message = JsonUtility.FromJson<VuplexMessage>(messageArgs.Value);
119+
120+
if (_jsHandlers.ContainsKey(message.method))
118121
{
119-
h.Value?.Invoke(e.Value.Substring(h.Key.Length + 1));
122+
_jsHandlers[message.method]?.Invoke(message.data);
120123
return;
121124
}
122-
}
123125

124-
OnJavaScriptMessage?.Invoke(e.Value);
126+
PassportLogger.Warn($"{TAG} No handler registered for method: {message.method}");
127+
}
128+
catch (Exception ex)
129+
{
130+
PassportLogger.Error($"{TAG} Failed to parse Vuplex message: {ex.Message}, Raw message: {messageArgs.Value}");
131+
// Fallback to raw message for backwards compatibility
132+
OnJavaScriptMessage?.Invoke(messageArgs.Value);
133+
}
125134
};
126-
_webViewPrefab.WebView.LoadFailed += (s, e) => PassportLogger.Warn($"{TAG} Load failed: {e.NativeErrorCode} for {e.Url}");
135+
_webViewPrefab.WebView.LoadFailed += (sender, failedArgs) => PassportLogger.Warn($"{TAG} Load failed: {failedArgs.NativeErrorCode} for {failedArgs.Url}");
127136

128137
_isInitialized = true;
129138
PassportLogger.Info($"{TAG} iOS WebView initialized successfully");
@@ -187,13 +196,10 @@ public void ExecuteJavaScript(string js)
187196
public void RegisterJavaScriptMethod(string methodName, Action<string> handler)
188197
{
189198
_jsHandlers[methodName] = handler;
199+
PassportLogger.Info($"{TAG} JavaScript method '{methodName}' registered for Vuplex message handling");
190200

191-
#if UNITY_IOS && !UNITY_EDITOR
192-
if (_isInitialized && _webViewPrefab?.WebView != null)
193-
{
194-
ExecuteJavaScript($"window.{methodName}=d=>window.vuplex?.postMessage('{methodName}:'+(typeof d==='object'?JSON.stringify(d):d))");
195-
}
196-
#endif
201+
// Note: No JavaScript injection needed with Vuplex - web page should call:
202+
// window.vuplex.postMessage({method: 'methodName', data: 'jsonData'})
197203
}
198204

199205
public void Dispose()

0 commit comments

Comments
 (0)