Написал приложение на
Tauri v2, внутри приложения работает специальный плагин
@tauri-apps/plugin-opener который позволяет открыть ссылку в браузере который установлен по умолчанию, но проблема в том что каждый раз ссылка открывается в новой вкладке.
Я пытался найти механизм или какую-то возможность открывать вкладки методом замены url, как это работает в JavaScript, чтобы каждый раз не дергать новую вкладку:
window.location.href = 'https://'
Но к сожалению пока что мне не удалось это сделать, хотя я пробовал различные решения от
eoka-agent и
headless_chrome, но это мне не помогло.
Изначально я хотел чтобы это работало для нескольких браузеров, то сейчас чтобы работало хотя-бы для Chrome, поэтому зашёл во всеми известный Claude AI и попросил написать функцию которая делала бы это на уровне Rust, вот что получилось:
#[tauri::command]
async fn open_in_existing_tab(url: String) -> Result<(), String> {
// Санитизируем URL — убираем кавычки чтобы не сломать скрипты
let safe_url = url.replace('"', "%22").replace('\'', "%27");
#[cfg(target_os = "macos")]
{
// AppleScript переписывает URL активной вкладки фронтового окна Chrome.
// Если Chrome не запущен — запускает его с нужным URL.
let script = format!(
r#"tell application "Google Chrome"
if not (running) then
open location "{url}"
else
if (count of windows) = 0 then
make new window
set URL of active tab of front window to "{url}"
else
set URL of active tab of front window to "{url}"
end if
activate
end if
end tell"#,
url = safe_url
);
std::process::Command::new("osascript")
.arg("-e")
.arg(&script)
.spawn()
.map_err(|e| format!("osascript spawn failed: {e}"))?;
return Ok(());
}
#[cfg(target_os = "windows")]
{
// Ищем chrome.exe в стандартных путях установки.
// Если Chrome уже открыт — --new-tab открывает URL в новой вкладке
// существующего окна (не создаёт новое окно).
// Это лучшее что можно сделать без CDP или расширения.
let chrome_paths = [
r"C:\Program Files\Google\Chrome\Application\chrome.exe",
r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe",
];
let chrome_exe = chrome_paths
.iter()
.find(|p| std::path::Path::new(p).exists())
.copied()
.unwrap_or("chrome.exe"); // fallback: надеемся что chrome есть в PATH
std::process::Command::new(chrome_exe)
.arg("--new-tab")
.arg(&safe_url)
.spawn()
.map_err(|e| format!("chrome spawn failed: {e}"))?;
return Ok(());
}
#[allow(unreachable_code)]
Err("open_in_existing_tab: unsupported platform".to_string())
}
Но при тестах на windows - всё также открывалась новая вкладка, а не менялся url на текущей. В общем если у кого-то была подобная цель - подскажите пожалуйста наилучший вариант решения.