68 lines
3.0 KiB
Rust
68 lines
3.0 KiB
Rust
//! WebKitWebContext management
|
|
//!
|
|
//! Port of `web_context.c` / `web_context.h` from the C project.
|
|
|
|
use webkit2gtk::*;
|
|
|
|
/// Create and configure a WebKitWebContext.
|
|
pub fn web_context_create() -> WebContext {
|
|
let ctx = WebContext::new();
|
|
|
|
// Register custom URI schemes
|
|
crate::nostr_scheme::nostr_scheme_register(&ctx);
|
|
crate::tor_scheme::tor_scheme_register(&ctx);
|
|
crate::local_scheme::local_scheme_register(&ctx);
|
|
|
|
// Security strip: register sovereign://, tor://, file://, ws:// as secure
|
|
// (no CORS enforcement / mixed-content blocking). Without this, WebKit
|
|
// blocks sovereign://nostr/* requests from HTTPS pages as "insecure
|
|
// content". Mirrors the C version (web_context.c:209).
|
|
if let Some(sec_mgr) = ctx.security_manager() {
|
|
sec_mgr.register_uri_scheme_as_secure("sovereign");
|
|
sec_mgr.register_uri_scheme_as_secure("tor");
|
|
sec_mgr.register_uri_scheme_as_secure("file");
|
|
sec_mgr.register_uri_scheme_as_secure("ws");
|
|
sec_mgr.register_uri_scheme_as_local("file");
|
|
// Register nostr:// as secure too so NIP-19 URIs work from HTTPS pages.
|
|
sec_mgr.register_uri_scheme_as_secure("nostr");
|
|
}
|
|
|
|
// Enable the favicon database so `notify::favicon` fires and
|
|
// `webview.favicon()` returns a surface. Without a directory the
|
|
// database is disabled and tab favicons never appear. Mirrors the C
|
|
// `webkit_web_context_set_favicon_database_directory()` (web_context.c:237).
|
|
let fav_dir = std::env::temp_dir().join("sovereign_browser-favicons");
|
|
ctx.set_favicon_database_directory(fav_dir.to_str());
|
|
|
|
ctx
|
|
}
|
|
|
|
/// Configure WebKitSettings for a web view.
|
|
pub fn web_context_configure_settings(settings: &webkit2gtk::Settings) {
|
|
settings.set_enable_javascript(true);
|
|
settings.set_enable_webgl(true);
|
|
settings.set_enable_webrtc(true);
|
|
// set_enable_plugins is deprecated since WebKitGTK 2.32 but there is no
|
|
// replacement; plugins are effectively dead in modern WebKit. Keep the
|
|
// call to explicitly disable them.
|
|
#[allow(deprecated)]
|
|
settings.set_enable_plugins(false);
|
|
settings.set_allow_modal_dialogs(true);
|
|
settings.set_enable_developer_extras(false);
|
|
// set_enable_private_browsing is deprecated in WebKitGTK 2.40+;
|
|
// use WebContext::set_is_ephemeral() instead. We don't need it here.
|
|
settings.set_enable_fullscreen(true);
|
|
settings.set_enable_media_stream(true);
|
|
settings.set_enable_smooth_scrolling(true);
|
|
// Deprecated since 2.32 with no replacement; keep for explicitness.
|
|
#[allow(deprecated)]
|
|
settings.set_enable_accelerated_2d_canvas(true);
|
|
// Console-to-stdout is OFF by default. The browser's stdout is usually a
|
|
// terminal, where writes are slow and can block the WebProcess; on a
|
|
// chatty page this is a real CPU cost. Enable via the
|
|
// `enable_write_console_messages_to_stdout` setting when debugging.
|
|
settings.set_enable_write_console_messages_to_stdout(
|
|
crate::settings::settings_get().enable_write_console_messages_to_stdout,
|
|
);
|
|
}
|