@@ -33,6 +33,7 @@ internal sealed unsafe class WpeWebViewAdapter
3333 private IntPtr _exportable ;
3434 private IntPtr _viewBackend ;
3535 private IntPtr _networkSession ;
36+ private IntPtr _userContentManager ;
3637 private IntPtr _cookieManager ;
3738 private bool _exportableOwnedByWebKit ; // true when webkit_web_view_backend_new took ownership
3839 private PixelSize _currentSize ;
@@ -231,15 +232,32 @@ private void Initialize(LinuxWpeWebViewEnvironmentRequestedEventArgs args, Contr
231232 else
232233 _networkSession = WpeInterop . webkit_network_session_get_default ( ) ;
233234
235+ _userContentManager = WpeInterop . webkit_user_content_manager_new ( ) ;
236+ if ( _userContentManager == IntPtr . Zero )
237+ throw new InvalidOperationException ( "webkit_user_content_manager_new failed." ) ;
238+
234239 var webViewType = WpeInterop . webkit_web_view_get_type ( ) ;
235240 var wkBackendType = WpeInterop . webkit_web_view_backend_get_type ( ) ;
236241 var networkSessionType = WpeInterop . webkit_network_session_get_type ( ) ;
237- var keys = new [ ] { "backend" , "network-session" } ;
238- var values = new [ ] { new GValue ( wkBackendType , wkBackend ) , new GValue ( networkSessionType , _networkSession ) } ;
239- _webView = WpeInterop . g_object_new_with_properties ( webViewType , 2 , keys , values ) ;
242+ var contentManagerType = WpeInterop . webkit_user_content_manager_get_type ( ) ;
243+ var keys = new [ ] { "backend" , "network-session" , "user-content-manager" } ;
244+ var values = new [ ]
245+ {
246+ new GValue ( wkBackendType , wkBackend ) ,
247+ new GValue ( networkSessionType , _networkSession ) ,
248+ new GValue ( contentManagerType , _userContentManager )
249+ } ;
250+ _webView = WpeInterop . g_object_new_with_properties ( webViewType , 3 , keys , values ) ;
240251 if ( _webView == IntPtr . Zero )
241252 throw new InvalidOperationException ( "webkit_web_view_new failed." ) ;
242253
254+ var viewContentManager = WpeInterop . webkit_web_view_get_user_content_manager ( _webView ) ;
255+ if ( viewContentManager != IntPtr . Zero && viewContentManager != _userContentManager )
256+ {
257+ WpeInterop . g_object_unref ( _userContentManager ) ;
258+ _userContentManager = WpeInterop . g_object_ref ( viewContentManager ) ;
259+ }
260+
243261 // 5. Start GLib pump (WebKit needs it for internal IPC)
244262 WpeGLibIntegration . Start ( ) ;
245263
@@ -258,11 +276,17 @@ private void Initialize(LinuxWpeWebViewEnvironmentRequestedEventArgs args, Contr
258276 ConnectSignal ( _webView , "decide-policy" , Marshal . GetFunctionPointerForDelegate ( _decidePolicyCallback ) , selfPtr ) ;
259277 ConnectSignal ( _webView , "create" , Marshal . GetFunctionPointerForDelegate ( _createCallback ) , selfPtr ) ;
260278
261- // 8. Register invokeCSharpAction message handler
262- var contentManager = WpeInterop . webkit_web_view_get_user_content_manager ( _webView ) ;
263- WpeInterop . webkit_user_content_manager_register_script_message_handler ( contentManager , "invokeCSharpAction" , null ) ;
264- ConnectSignal ( contentManager , "script-message-received::invokeCSharpAction" ,
279+ // 8. Register the message handler, connecting before registering so that no message can arrive unhandled.
280+ ConnectSignal ( _userContentManager , $ "script-message-received::{ WebViewHelper . PostAvWebViewMessageName } ",
265281 Marshal . GetFunctionPointerForDelegate ( _scriptMessageCallback ) , selfPtr ) ;
282+ WpeInterop . webkit_user_content_manager_register_script_message_handler (
283+ _userContentManager , WebViewHelper . PostAvWebViewMessageName , null ) ;
284+
285+ // Inject the invokeCSharpAction wrapper into all frames at document start.
286+ var bridgeScript = WpeInterop . webkit_user_script_new (
287+ WebViewHelper . BuildWebKitInvokeCSharpActionScript ( ) , 0 , 0 , IntPtr . Zero , IntPtr . Zero ) ;
288+ WpeInterop . webkit_user_content_manager_add_script ( _userContentManager , bridgeScript ) ;
289+ WpeInterop . webkit_user_script_unref ( bridgeScript ) ;
266290
267291 // 9. Apply settings
268292 var settings = WpeInterop . webkit_web_view_get_settings ( _webView ) ;
@@ -1019,6 +1043,12 @@ public void Dispose()
10191043 _webView = IntPtr . Zero ;
10201044 }
10211045
1046+ if ( _userContentManager != IntPtr . Zero )
1047+ {
1048+ WpeInterop . g_object_unref ( _userContentManager ) ;
1049+ _userContentManager = IntPtr . Zero ;
1050+ }
1051+
10221052 if ( ! _exportableOwnedByWebKit && _exportable != IntPtr . Zero )
10231053 {
10241054 WpeInterop . wpe_view_backend_exportable_fdo_destroy ( _exportable ) ;
0 commit comments