diff --git a/.nix/deps/rust-gpu.nix b/.nix/deps/rust-gpu.nix index 800abb7f90..baa03184ad 100644 --- a/.nix/deps/rust-gpu.nix +++ b/.nix/deps/rust-gpu.nix @@ -1,16 +1,15 @@ { pkgs, ... }: let - extensions = [ - "rust-src" - "rust-analyzer" - "clippy" - "cargo" - "rustc-dev" - "llvm-tools" - ]; toolchain = pkgs.rust-bin.nightly."2026-04-11".default.override { - inherit extensions; + extensions = [ + "rust-src" + "rust-analyzer" + "clippy" + "cargo" + "rustc-dev" + "llvm-tools" + ]; }; cargo = pkgs.writeShellScriptBin "cargo" '' #!${pkgs.lib.getExe pkgs.bash} diff --git a/desktop/src/cef/context/builder.rs b/desktop/src/cef/context/builder.rs index 4d79ec55d9..de4e3af7f2 100644 --- a/desktop/src/cef/context/builder.rs +++ b/desktop/src/cef/context/builder.rs @@ -45,8 +45,7 @@ impl CefContextBuilder { let args = Args::new(); let cmd = args.as_cmd_line().unwrap(); - let switch = CefString::from("type"); - let is_sub_process = cmd.has_switch(Some(&switch)) == 1; + let is_sub_process = cmd.has_switch(Some(&"type".into())) == 1; Self { args, @@ -61,8 +60,7 @@ impl CefContextBuilder { pub(crate) fn execute_sub_process(&self) -> SetupError { let cmd = self.args.as_cmd_line().unwrap(); - let switch = CefString::from("type"); - let process_type = CefString::from(&cmd.switch_value(Some(&switch))); + let process_type = CefString::from(&cmd.switch_value(Some(&"type".into()))); let mut app = RenderProcessAppImpl::::app(); let ret = execute_process(Some(self.args.as_main_args()), Some(&mut app), std::ptr::null_mut()); if ret >= 0 { @@ -88,7 +86,7 @@ impl CefContextBuilder { Settings { windowless_rendering_enabled: 1, root_cache_path: instance_dir.to_str().map(CefString::from).unwrap(), - cache_path: CefString::from(""), + cache_path: "".into(), disable_signal_handlers: 1, log_severity, ..Default::default() @@ -103,7 +101,7 @@ impl CefContextBuilder { let app_root = exe.parent().and_then(|p| p.parent()).expect("bad path structure").parent().expect("bad path structure"); let settings = Settings { - main_bundle_path: CefString::from(app_root.to_str().unwrap()), + main_bundle_path: app_root.to_str().map(CefString::from).unwrap(), multi_threaded_message_loop: 0, external_message_pump: 1, no_sandbox: 1, // GPU helper crashes when running with sandbox @@ -181,7 +179,7 @@ fn create_browser(event_handler: H, instance_dir: TempDir, d let Some(mut incognito_request_context) = cef::request_context_create_context( Some(&RequestContextSettings { persist_session_cookies: 0, - cache_path: CefString::from(""), + cache_path: "".into(), ..Default::default() }), Option::<&mut cef::RequestContextHandler>::None, @@ -191,14 +189,14 @@ fn create_browser(event_handler: H, instance_dir: TempDir, d let mut scheme_handler_factory = SchemeHandlerFactory::new(SchemeHandlerFactoryImpl::new(event_handler.duplicate())); incognito_request_context.clear_scheme_handler_factories(); - incognito_request_context.register_scheme_handler_factory(Some(&CefString::from(RESOURCE_SCHEME)), Some(&CefString::from(RESOURCE_DOMAIN)), Some(&mut scheme_handler_factory)); + incognito_request_context.register_scheme_handler_factory(Some(&RESOURCE_SCHEME.into()), Some(&RESOURCE_DOMAIN.into()), Some(&mut scheme_handler_factory)); - let url = CefString::from(format!("{RESOURCE_SCHEME}://{RESOURCE_DOMAIN}/").as_str()); + let url = format!("{RESOURCE_SCHEME}://{RESOURCE_DOMAIN}/"); let browser = browser_host_create_browser_sync( Some(&window_info), Some(&mut client), - Some(&url), + Some(&url.as_str().into()), Some(&settings), Option::<&mut DictionaryValue>::None, Some(&mut incognito_request_context), diff --git a/desktop/src/cef/internal/browser_process_app.rs b/desktop/src/cef/internal/browser_process_app.rs index 413eb04228..6cbab87957 100644 --- a/desktop/src/cef/internal/browser_process_app.rs +++ b/desktop/src/cef/internal/browser_process_app.rs @@ -1,6 +1,3 @@ -#[cfg(target_os = "linux")] -use std::env; - use cef::rc::{Rc, RcImpl}; use cef::sys::{_cef_app_t, cef_base_ref_counted_t}; use cef::{BrowserProcessHandler, CefString, ImplApp, ImplCommandLine, SchemeRegistrar, WrapApp}; @@ -33,81 +30,71 @@ impl ImplApp for BrowserProcessAppImpl { fn on_before_command_line_processing(&self, _process_type: Option<&cef::CefString>, command_line: Option<&mut cef::CommandLine>) { if let Some(cmd) = command_line { - cmd.append_switch_with_value(Some(&CefString::from("renderer-process-limit")), Some(&CefString::from("1"))); - cmd.append_switch_with_value(Some(&CefString::from("password-store")), Some(&CefString::from("basic"))); - cmd.append_switch_with_value(Some(&CefString::from("disk-cache-size")), Some(&CefString::from("0"))); - cmd.append_switch(Some(&CefString::from("incognito"))); - cmd.append_switch(Some(&CefString::from("no-first-run"))); - cmd.append_switch(Some(&CefString::from("no-default-browser-check"))); - cmd.append_switch(Some(&CefString::from("disable-component-update"))); - cmd.append_switch(Some(&CefString::from("disable-geolocation"))); - cmd.append_switch(Some(&CefString::from("disable-notifications"))); - cmd.append_switch(Some(&CefString::from("disable-audio-input"))); - cmd.append_switch(Some(&CefString::from("disable-audio-output"))); - cmd.append_switch(Some(&CefString::from("disable-sync"))); - cmd.append_switch(Some(&CefString::from("disable-file-system"))); - cmd.append_switch(Some(&CefString::from("disable-local-storage"))); - cmd.append_switch(Some(&CefString::from("disable-background-networking"))); - cmd.append_switch(Some(&CefString::from("disable-default-apps"))); - cmd.append_switch(Some(&CefString::from("disable-breakpad"))); - cmd.append_switch_with_value(Some(&CefString::from("disable-blink-features")), Some(&CefString::from("WebBluetooth,WebUSB,Serial"))); + cmd.append_switch_with_value(Some(&"renderer-process-limit".into()), Some(&"1".into())); + cmd.append_switch_with_value(Some(&"password-store".into()), Some(&"basic".into())); + cmd.append_switch_with_value(Some(&"disk-cache-size".into()), Some(&"0".into())); + cmd.append_switch(Some(&"no-sandbox".into())); + cmd.append_switch(Some(&"no-first-run".into())); + cmd.append_switch(Some(&"noerrdialogs".into())); + cmd.append_switch(Some(&"no-default-browser-check".into())); + cmd.append_switch(Some(&"mute-audio".into())); + cmd.append_switch(Some(&"use-fake-device-for-media-stream".into())); + cmd.append_switch(Some(&"incognito".into())); + cmd.append_switch(Some(&"disable-sync".into())); + cmd.append_switch(Some(&"disable-file-system".into())); + cmd.append_switch(Some(&"disable-component-update".into())); + cmd.append_switch(Some(&"disable-geolocation".into())); + cmd.append_switch(Some(&"disable-notifications".into())); + cmd.append_switch(Some(&"disable-background-networking".into())); + cmd.append_switch(Some(&"disable-default-apps".into())); + cmd.append_switch(Some(&"disable-breakpad".into())); + cmd.append_switch_with_value(Some(&"disable-blink-features".into()), Some(&"WebBluetooth,WebUSB,Serial".into())); let extra_disabled_features = ["OptimizationHints", "OnDeviceModelService", "TranslateUI"]; - let disabled_features_switch = Some(&CefString::from("disable-features")); + let disabled_features_switch = Some(&"disable-features".into()); let disabled_features: String = CefString::from(&cmd.switch_value(disabled_features_switch)) .to_string() .split(',') .chain(extra_disabled_features) .collect::>() .join(","); - cmd.append_switch_with_value(disabled_features_switch, Some(&CefString::from(disabled_features.as_str()))); + cmd.append_switch_with_value(disabled_features_switch, Some(&disabled_features.as_str().into())); #[cfg(not(feature = "accelerated_paint"))] { // Disable GPU acceleration when accelerated_paint feature is not enabled - cmd.append_switch(Some(&CefString::from("disable-gpu"))); - cmd.append_switch(Some(&CefString::from("disable-gpu-compositing"))); + cmd.append_switch(Some(&"disable-gpu".into())); + cmd.append_switch(Some(&"disable-gpu-compositing".into())); } #[cfg(feature = "accelerated_paint")] { - // Enable GPU acceleration switches for better performance - cmd.append_switch(Some(&CefString::from("enable-gpu-rasterization"))); - cmd.append_switch(Some(&CefString::from("enable-accelerated-2d-canvas"))); + // cmd.append_switch(Some(&"transparent-painting-enabled".into())); + cmd.append_switch(Some(&"enable-zero-copy".into())); + // cmd.append_switch(Some(&"off-screen-rendering-enabled".into())); + // cmd.append_switch(Some(&"use-views".into())); + cmd.append_switch(Some(&"enable-gpu-rasterization".into())); + cmd.append_switch(Some(&"enable-accelerated-2d-canvas".into())); } #[cfg(all(feature = "accelerated_paint", target_os = "linux"))] { - // Use Vulkan for accelerated painting - cmd.append_switch_with_value(Some(&CefString::from("use-angle")), Some(&CefString::from("vulkan"))); - } - - // Tell CEF to use Wayland if available - #[cfg(target_os = "linux")] - { - let use_wayland = env::var("WAYLAND_DISPLAY") - .ok() - .filter(|var| !var.is_empty()) - .or_else(|| env::var("WAYLAND_SOCKET").ok()) - .filter(|var| !var.is_empty()) - .is_some(); - if use_wayland { - cmd.append_switch_with_value(Some(&CefString::from("ozone-platform")), Some(&CefString::from("wayland"))); - } + cmd.append_switch_with_value(Some(&"use-angle".into()), Some(&"gl-egl".into())); + cmd.append_switch_with_value(Some(&"ozone-platform".into()), Some(&"headless".into())); } #[cfg(target_os = "macos")] { // Hide user prompt asking for keychain access - cmd.append_switch(Some(&CefString::from("use-mock-keychain"))); + cmd.append_switch(Some(&"use-mock-keychain".into())); } // Enable browser debugging via environment variable if let Some(env) = std::env::var("GRAPHITE_BROWSER_DEBUG_PORT").ok() && let Some(port) = env.parse::().ok() { - cmd.append_switch_with_value(Some(&CefString::from("remote-debugging-port")), Some(&CefString::from(port.to_string().as_str()))); - cmd.append_switch_with_value(Some(&CefString::from("remote-allow-origins")), Some(&CefString::from("*"))); + cmd.append_switch_with_value(Some(&"remote-debugging-port".into()), Some(&port.to_string().as_str().into())); + cmd.append_switch_with_value(Some(&"remote-allow-origins".into()), Some(&"*".into())); } } } diff --git a/desktop/src/cef/internal/render_process_handler.rs b/desktop/src/cef/internal/render_process_handler.rs index 45ce66cf9a..09b777f456 100644 --- a/desktop/src/cef/internal/render_process_handler.rs +++ b/desktop/src/cef/internal/render_process_handler.rs @@ -1,6 +1,6 @@ use cef::rc::{ConvertReturnValue, Rc, RcImpl}; use cef::sys::{_cef_render_process_handler_t, cef_base_ref_counted_t, cef_render_process_handler_t, cef_v8_propertyattribute_t, cef_v8_value_create_array_buffer_with_copy}; -use cef::{CefString, ImplFrame, ImplRenderProcessHandler, ImplV8Context, ImplV8Value, V8Handler, V8Propertyattribute, V8Value, WrapRenderProcessHandler, v8_value_create_function}; +use cef::{ImplFrame, ImplRenderProcessHandler, ImplV8Context, ImplV8Value, V8Handler, V8Propertyattribute, V8Value, WrapRenderProcessHandler, v8_value_create_function}; use crate::cef::ipc::{MessageType, UnpackMessage, UnpackedMessage}; @@ -53,13 +53,13 @@ impl ImplRenderProcessHandler for RenderProcessHandlerImpl { let function_call = format!("window.{function_name}(window.{property_name})"); global.set_value_bykey( - Some(&CefString::from(property_name)), + Some(&property_name.into()), Some(&mut value), cef_v8_propertyattribute_t::V8_PROPERTY_ATTRIBUTE_READONLY.wrap_result(), ); - if global.value_bykey(Some(&CefString::from(function_name))).is_some() { - frame.execute_java_script(Some(&CefString::from(function_call.as_str())), None, 0); + if global.value_bykey(Some(&function_name.into())).is_some() { + frame.execute_java_script(Some(&function_call.as_str().into()), None, 0); } if context.exit() == 0 { @@ -78,7 +78,7 @@ impl ImplRenderProcessHandler for RenderProcessHandlerImpl { fn on_context_created(&self, _browser: Option<&mut cef::Browser>, _frame: Option<&mut cef::Frame>, context: Option<&mut cef::V8Context>) { let register_js_function = |context: &mut cef::V8Context, name: &'static str| { let mut v8_handler = V8Handler::new(RenderProcessV8HandlerImpl::new()); - let Some(mut function) = v8_value_create_function(Some(&CefString::from(name)), Some(&mut v8_handler)) else { + let Some(mut function) = v8_value_create_function(Some(&name.into()), Some(&mut v8_handler)) else { tracing::error!("Failed to create V8 function {name}"); return; }; @@ -87,7 +87,7 @@ impl ImplRenderProcessHandler for RenderProcessHandlerImpl { tracing::error!("Global object is not available in V8 context"); return; }; - global.set_value_bykey(Some(&CefString::from(name)), Some(&mut function), V8Propertyattribute::default()); + global.set_value_bykey(Some(&name.into()), Some(&mut function), V8Propertyattribute::default()); }; let Some(context) = context else { diff --git a/desktop/src/cef/internal/resource_handler.rs b/desktop/src/cef/internal/resource_handler.rs index 8c21b2cfb5..feb33b937d 100644 --- a/desktop/src/cef/internal/resource_handler.rs +++ b/desktop/src/cef/internal/resource_handler.rs @@ -46,15 +46,14 @@ impl ImplResourceHandler for ResourceHandlerImpl { if let Some(response) = response { if self.reader.is_some() { if let Some(mimetype) = &self.mimetype { - let cef_mime = CefString::from(mimetype.as_str()); - response.set_mime_type(Some(&cef_mime)); + response.set_mime_type(Some(&mimetype.as_str().into())); } else { response.set_mime_type(None); } response.set_status(200); } else { response.set_status(404); - response.set_mime_type(Some(&CefString::from("text/plain"))); + response.set_mime_type(Some(&"text/plain".into())); } } } diff --git a/desktop/src/cef/internal/scheme_handler_factory.rs b/desktop/src/cef/internal/scheme_handler_factory.rs index 2c597df5ef..e74b8cede5 100644 --- a/desktop/src/cef/internal/scheme_handler_factory.rs +++ b/desktop/src/cef/internal/scheme_handler_factory.rs @@ -25,7 +25,7 @@ impl SchemeHandlerFactoryImpl { scheme_options |= cef_scheme_options_t::CEF_SCHEME_OPTION_FETCH_ENABLED as i32; scheme_options |= cef_scheme_options_t::CEF_SCHEME_OPTION_SECURE as i32; scheme_options |= cef_scheme_options_t::CEF_SCHEME_OPTION_CORS_ENABLED as i32; - registrar.add_custom_scheme(Some(&CefString::from(RESOURCE_SCHEME)), scheme_options); + registrar.add_custom_scheme(Some(&RESOURCE_SCHEME.into()), scheme_options); } } } diff --git a/desktop/src/cef/ipc.rs b/desktop/src/cef/ipc.rs index b1a27741b1..383cf5e87e 100644 --- a/desktop/src/cef/ipc.rs +++ b/desktop/src/cef/ipc.rs @@ -1,4 +1,4 @@ -use cef::{CefString, Frame, ImplBinaryValue, ImplFrame, ImplListValue, ImplProcessMessage, ImplV8Context, ProcessId, V8Context, sys::cef_process_id_t}; +use cef::{Frame, ImplBinaryValue, ImplFrame, ImplListValue, ImplProcessMessage, ImplV8Context, ProcessId, V8Context, sys::cef_process_id_t}; pub(crate) enum MessageType { Initialized, @@ -67,7 +67,7 @@ impl SendMessage for Frame { fn send_message(&self, message_type: MessageType, message: &[u8]) { let MessageInfo { name, target } = message_type.into(); - let Some(mut process_message) = cef::process_message_create(Some(&CefString::from(name.as_str()))) else { + let Some(mut process_message) = cef::process_message_create(Some(&name.as_str().into())) else { tracing::error!("Failed to create process message: {}", name); return; };