feat: set default search engine on camoufox

This commit is contained in:
zhom
2026-03-02 12:36:11 +04:00
parent e1461693da
commit 01d600f97e
4 changed files with 90 additions and 42 deletions
+16
View File
@@ -1616,6 +1616,7 @@ dependencies = [
"lazy_static",
"libc",
"log",
"lz4_flex",
"lzma-rs",
"maxminddb",
"mime_guess",
@@ -3452,6 +3453,15 @@ dependencies = [
"imgref",
]
[[package]]
name = "lz4_flex"
version = "0.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a"
dependencies = [
"twox-hash",
]
[[package]]
name = "lzma-rs"
version = "0.3.0"
@@ -7160,6 +7170,12 @@ dependencies = [
"utf-8",
]
[[package]]
name = "twox-hash"
version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c"
[[package]]
name = "typed-path"
version = "0.12.3"
+1
View File
@@ -100,6 +100,7 @@ maxminddb = "0.27"
quick-xml = { version = "0.39", features = ["serialize"] }
# VPN support
lz4_flex = "0.11"
boringtun = "0.7"
smoltcp = { version = "0.11", default-features = false, features = ["std", "medium-ip", "proto-ipv4", "proto-ipv6", "socket-tcp", "socket-udp"] }
-8
View File
@@ -223,14 +223,6 @@ impl BrowserRunner {
);
}
// Ensure DuckDuckGo is set as default search engine for Camoufox
let mut browser_dir = self.get_binaries_dir();
browser_dir.push(&profile.browser);
browser_dir.push(&profile.version);
if let Err(e) = crate::downloader::configure_camoufox_search_engine(&browser_dir) {
log::warn!("Failed to configure Camoufox search engine: {e}");
}
// Create ephemeral dir for ephemeral profiles
let override_profile_path = if profile.ephemeral {
let dir = crate::ephemeral_dirs::create_ephemeral_dir(&profile.id.to_string())
+73 -34
View File
@@ -628,40 +628,8 @@ impl CamoufoxManager {
}
}
// Write DuckDuckGo search engine prefs to user.js for all profiles
{
let user_js_path = profile_path.join("user.js");
let ddg_prefs = concat!(
"user_pref(\"browser.search.defaultenginename\", \"DuckDuckGo\");\n",
"user_pref(\"browser.search.order.1\", \"DuckDuckGo\");\n",
"user_pref(\"browser.urlbar.placeholderName\", \"DuckDuckGo\");\n",
"user_pref(\"browser.urlbar.placeholderName.private\", \"DuckDuckGo\");\n",
);
let needs_write = if user_js_path.exists() {
std::fs::read_to_string(&user_js_path)
.map(|existing| !existing.contains("browser.search.defaultenginename"))
.unwrap_or(false)
} else {
true
};
if needs_write {
use std::fs::OpenOptions;
match OpenOptions::new()
.create(true)
.append(true)
.open(&user_js_path)
{
Ok(mut f) => {
if let Err(e) = std::io::Write::write_all(&mut f, ddg_prefs.as_bytes()) {
log::warn!("Failed to write DuckDuckGo prefs to user.js: {e}");
}
}
Err(e) => log::warn!("Failed to open user.js for DuckDuckGo prefs: {e}"),
}
}
}
// Write search.json.mozlz4 with default search engines (DuckDuckGo + Google)
write_default_search_config(&profile_path);
self
.launch_camoufox(
@@ -676,6 +644,77 @@ impl CamoufoxManager {
}
}
fn write_default_search_config(profile_path: &std::path::Path) {
let search_file = profile_path.join("search.json.mozlz4");
if search_file.exists() {
return;
}
let json = serde_json::json!({
"version": 6,
"engines": [
{
"_name": "DuckDuckGo",
"_isAppProvided": false,
"_metaData": { "order": 1 },
"_urls": [
{
"template": "https://duckduckgo.com/?q={searchTerms}",
"type": "text/html",
"params": []
},
{
"template": "https://duckduckgo.com/ac/?q={searchTerms}&type=list",
"type": "application/x-suggestions+json",
"params": []
}
],
"_iconURL": "https://duckduckgo.com/favicon.ico"
},
{
"_name": "Google",
"_isAppProvided": false,
"_metaData": { "order": 2 },
"_urls": [
{
"template": "https://www.google.com/search?q={searchTerms}",
"type": "text/html",
"params": []
},
{
"template": "https://www.google.com/complete/search?client=firefox&q={searchTerms}",
"type": "application/x-suggestions+json",
"params": []
}
],
"_iconURL": "https://www.google.com/favicon.ico"
}
],
"metaData": {
"useSavedOrder": false,
"defaultEngineId": "DuckDuckGo"
}
});
let json_bytes = match serde_json::to_vec(&json) {
Ok(bytes) => bytes,
Err(e) => {
log::warn!("Failed to serialize search config: {e}");
return;
}
};
let magic = b"mozLz40\0";
let compressed = lz4_flex::block::compress_prepend_size(&json_bytes);
let mut output = Vec::with_capacity(magic.len() + compressed.len());
output.extend_from_slice(magic);
output.extend_from_slice(&compressed);
if let Err(e) = std::fs::write(&search_file, &output) {
log::warn!("Failed to write search.json.mozlz4: {e}");
}
}
#[cfg(test)]
mod tests {
use super::*;