ltk_webkit/wpe/
context.rsuse std::ffi::c_char;
use std::ptr;
use std::sync::OnceLock;
use std::sync::atomic::{ AtomicU32, Ordering };
use gobject_sys::g_object_new;
use wpe_webkit_sys::*;
use crate::types::CacheModel;
static MEMORY_LIMIT_MIB: AtomicU32 = AtomicU32::new( 0 );
static CONTEXT: OnceLock<usize> = OnceLock::new();
pub fn set_memory_limit( mib: u32 )
{
if mib == 0 { return; }
MEMORY_LIMIT_MIB.store( mib, Ordering::Relaxed );
unsafe
{
let settings = memory_pressure_settings( mib );
webkit_network_session_set_memory_pressure_settings( settings );
webkit_memory_pressure_settings_free( settings );
}
}
pub fn set_cache_model( model: CacheModel )
{
let model = match model
{
CacheModel::DocumentViewer => WEBKIT_CACHE_MODEL_DOCUMENT_VIEWER,
CacheModel::DocumentBrowser => WEBKIT_CACHE_MODEL_DOCUMENT_BROWSER,
CacheModel::WebBrowser => WEBKIT_CACHE_MODEL_WEB_BROWSER,
};
unsafe { webkit_web_context_set_cache_model( web_context(), model ); }
}
fn memory_pressure_settings( mib: u32 ) -> *mut WebKitMemoryPressureSettings
{
unsafe
{
let settings = webkit_memory_pressure_settings_new();
webkit_memory_pressure_settings_set_memory_limit( settings, mib );
settings
}
}
pub( crate ) fn web_context() -> *mut WebKitWebContext
{
let context = *CONTEXT.get_or_init( ||
{
let mib = MEMORY_LIMIT_MIB.load( Ordering::Relaxed );
unsafe
{
if mib == 0 { return webkit_web_context_get_default() as usize; }
let settings = memory_pressure_settings( mib );
let context = g_object_new(
webkit_web_context_get_type(),
b"memory-pressure-settings\0".as_ptr() as *const c_char,
settings,
ptr::null::<c_char>(),
);
webkit_memory_pressure_settings_free( settings );
if context.is_null() { webkit_web_context_get_default() as usize } else { context as usize }
}
} );
context as *mut WebKitWebContext
}