Задать вопрос
x4zx
@x4zx
python developer

Открытие страницы без новой вкладки в tauri?

Написал приложение на 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 на текущей. В общем если у кого-то была подобная цель - подскажите пожалуйста наилучший вариант решения.
  • Вопрос задан
  • 113 просмотров
Подписаться 2 Средний 3 комментария
Помогут разобраться в теме Все курсы
  • Skillbox
    Курс по TypeScript
    3 месяца
    Далее
  • Merion Academy
    Онлайн-курс по TypeScript
    2 месяца
    Далее
  • Учебный центр IBS
    WEB-015 Язык программирования TypeScript
    1 неделя
    Далее
Решения вопроса 1
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
который позволяет открыть ссылку в браузере который установлен по умолчанию, но проблема в том что каждый раз ссылка открывается в новой вкладке

Это нормальное и правильное поведение. Открывать новую ссылку в текущей вкладке — не является нормальным и адекватным решением. Вообще, это можно рассматривать как вредное поведение. Вдруг у пользователя там что-то важное открыто или документ какой-то? За обработку протокола отвечают настройки операционной системы. Это поведение можно поменять, но это будет уже глобально, а какому пользователю это понравится? Кроме того, в хроме, например, этот функционал не поддерживается и не будет: https://issues.chromium.org/issues/40258305
А вот для фаерфокса есть плагин. Возможно и для хрома тоже есть — не искал.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы