ltk_webkit/wpe/
session.rsuse std::ffi::{ CStr, CString, OsStr };
use std::fs;
use std::os::unix::ffi::OsStrExt;
use std::path::Path;
use std::sync::OnceLock;
use wpe_webkit_sys::*;
static DIRECTORIES: OnceLock<( CString, CString )> = OnceLock::new();
static SESSION: OnceLock<usize> = OnceLock::new();
pub fn set_data_directories( data: &Path, cache: &Path )
{
let ( Ok( data ), Ok( cache ) ) = ( CString::new( data.as_os_str().as_bytes() ), CString::new( cache.as_os_str().as_bytes() ) ) else { return };
let _ = DIRECTORIES.set( ( data, cache ) );
}
pub fn prefetch_dns( host: &str )
{
let Ok( host ) = CString::new( host ) else { return };
let session = network_session();
if session.is_null() { return; }
unsafe { webkit_network_session_prefetch_dns( session, host.as_ptr() ); }
}
pub( crate ) fn network_session() -> *mut WebKitNetworkSession
{
*SESSION.get_or_init( ||
{
unsafe
{
let session = match DIRECTORIES.get()
{
Some( ( data, cache ) ) => webkit_network_session_new( data.as_ptr(), cache.as_ptr() ),
None => webkit_network_session_get_default(),
};
keep_cookies( session );
session as usize
}
} ) as *mut WebKitNetworkSession
}
unsafe fn keep_cookies( session: *mut WebKitNetworkSession )
{
unsafe
{
if session.is_null() || webkit_network_session_is_ephemeral( session ) != 0 { return; }
let manager = webkit_network_session_get_website_data_manager( session );
if manager.is_null() { return; }
let directory = webkit_website_data_manager_get_base_data_directory( manager );
if directory.is_null() { return; }
let directory = Path::new( OsStr::from_bytes( CStr::from_ptr( directory ).to_bytes() ) );
if fs::create_dir_all( directory ).is_err() { return; }
let Ok( file ) = CString::new( directory.join( "cookies.sqlite" ).as_os_str().as_bytes() ) else { return };
let cookies = webkit_network_session_get_cookie_manager( session );
if !cookies.is_null() { webkit_cookie_manager_set_persistent_storage( cookies, file.as_ptr(), WEBKIT_COOKIE_PERSISTENT_STORAGE_SQLITE ); }
}
}