ltk_webkit/wpe/
termination.rsuse std::ffi::c_char;
use std::sync::{ Mutex, Weak };
use glib_sys::gpointer;
use gobject_sys::{ g_signal_connect_data, GObject };
use wpe_webkit_sys::*;
use super::{ popups, Inner, WebView };
use crate::types::Termination;
type TerminatedFn = unsafe extern "C" fn( *mut WebKitWebView, WebKitWebProcessTerminationReason, gpointer );
impl WebView
{
pub fn terminate_web_process( &self )
{
let Ok( g ) = self.inner.lock() else { return };
let webview = g.webview;
drop( g );
if !webview.is_null() { unsafe { webkit_web_view_terminate_web_process( webview ); } }
}
pub fn take_termination( &self ) -> Option<Termination>
{
self.inner.lock().ok().and_then( |mut g| g.termination.take() )
}
}
pub( crate ) unsafe fn connect( webview: *mut WebKitWebView, inner: Weak<Mutex<Inner>> )
{
unsafe
{
let handler = std::mem::transmute::<TerminatedFn, unsafe extern "C" fn()>( on_terminated );
let data = Box::into_raw( Box::new( inner ) ) as gpointer;
g_signal_connect_data( webview as *mut GObject, b"web-process-terminated\0".as_ptr() as *const c_char, Some( handler ), data, Some( popups::drop_weak ), 0 );
}
}
unsafe extern "C" fn on_terminated( _webview: *mut WebKitWebView, reason: WebKitWebProcessTerminationReason, user_data: gpointer )
{
let Some( inner ) = unsafe { &*( user_data as *const Weak<Mutex<Inner>> ) }.upgrade() else { return };
let termination = match reason
{
WEBKIT_WEB_PROCESS_EXCEEDED_MEMORY_LIMIT => Termination::ExceededMemoryLimit,
WEBKIT_WEB_PROCESS_TERMINATED_BY_API => Termination::Requested,
_ => Termination::Crashed,
};
if let Ok( mut g ) = inner.lock() { g.termination = Some( termination ); };
}