fix: register browser_hide_all command
Browse files- src-tauri/src/lib.rs +88 -88
src-tauri/src/lib.rs
CHANGED
|
@@ -1,88 +1,88 @@
|
|
| 1 |
-
mod adblock;
|
| 2 |
-
mod browser;
|
| 3 |
-
mod credentials;
|
| 4 |
-
mod library;
|
| 5 |
-
mod board;
|
| 6 |
-
mod color_tools;
|
| 7 |
-
mod persistence;
|
| 8 |
-
mod sessions;
|
| 9 |
-
mod study;
|
| 10 |
-
mod downloads;
|
| 11 |
-
mod settings;
|
| 12 |
-
mod state;
|
| 13 |
-
mod history;
|
| 14 |
-
mod projects;
|
| 15 |
-
mod refs_format;
|
| 16 |
-
|
| 17 |
-
use crate::state::AppState;
|
| 18 |
-
use tauri::{Emitter, Manager};
|
| 19 |
-
use tauri_plugin_sql::{Migration, MigrationKind};
|
| 20 |
-
|
| 21 |
-
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
| 22 |
-
pub fn run() {
|
| 23 |
-
tauri::Builder::default()
|
| 24 |
-
.plugin(tauri_plugin_opener::init())
|
| 25 |
-
.plugin(tauri_plugin_store::Builder::default().build())
|
| 26 |
-
.plugin(tauri_plugin_fs::init())
|
| 27 |
-
.plugin(tauri_plugin_clipboard_manager::init())
|
| 28 |
-
.plugin(tauri_plugin_sql::Builder::default().add_migrations("sqlite:muse_alpha_v2.db", migrations()).build())
|
| 29 |
-
.plugin(tauri_plugin_stronghold::Builder::new(|password| { let salt = b"muse-vault-kdf-salt-2026-v1-prod"; let mut key = [0u8; 32]; argon2::Argon2::default().hash_password_into(password.as_bytes(), salt, &mut key).expect("argon2 KDF failed"); key.to_vec() }).build())
|
| 30 |
-
.register_uri_scheme_protocol("muse-action", |ctx, request| {
|
| 31 |
-
let uri = request.uri().to_string();
|
| 32 |
-
let app = ctx.app_handle().clone();
|
| 33 |
-
let action = uri.split("://").nth(1).unwrap_or("").split('?').next().unwrap_or("").to_string();
|
| 34 |
-
let query = uri.split('?').nth(1).unwrap_or("");
|
| 35 |
-
let params: std::collections::HashMap<String, String> = query.split('&').filter_map(|pair| { let (k, v) = pair.split_once('=')?; Some((percent_decode(k), percent_decode(v))) }).collect();
|
| 36 |
-
match action.as_str() {
|
| 37 |
-
"library" => { let url = params.get("url").cloned().unwrap_or_default(); if !url.is_empty() { let source = params.get("source").cloned(); let title = params.get("title").cloned(); tauri::async_runtime::spawn(async move { let _ = crate::library::library_add_item(app, url, source, title).await; }); } }
|
| 38 |
-
"board" => { let url = params.get("url").cloned().unwrap_or_default(); if !url.is_empty() { let source = params.get("source").cloned(); let title = params.get("title").cloned(); tauri::async_runtime::spawn(async move { if let Ok(item) = crate::library::library_add_item(app.clone(), url, source, title).await { let _ = crate::board::board_add_image(app, Some(item.id), item.data_url, 120.0, 120.0, 300.0, 200.0); } }); } }
|
| 39 |
-
"vault" => { let va = params.get("action").cloned().unwrap_or_default(); match va.as_str() { "save-prompt" => { let _ = app.emit("vault://save-prompt", serde_json::json!({"origin": params.get("origin").cloned().unwrap_or_default(), "username": params.get("username").cloned().unwrap_or_default(), "password": params.get("password").cloned().unwrap_or_default()})); } "has-login-form" => { let _ = app.emit("vault://login-detected", serde_json::json!({"origin": params.get("origin").cloned().unwrap_or_default(), "fields": params.get("fields").cloned().unwrap_or_default()})); } _ => {} } }
|
| 40 |
-
_ => {}
|
| 41 |
-
}
|
| 42 |
-
tauri::http::Response::builder().status(200).header("Access-Control-Allow-Origin", "*").body(Vec::new()).unwrap()
|
| 43 |
-
})
|
| 44 |
-
.manage(state::AppState::default())
|
| 45 |
-
.manage(adblock::engine::AdBlockState::new())
|
| 46 |
-
.manage(library::LibraryState::default())
|
| 47 |
-
.manage(board::BoardState::default())
|
| 48 |
-
.manage(downloads::DownloadState::default())
|
| 49 |
-
.manage(study::StudyState::default())
|
| 50 |
-
.invoke_handler(tauri::generate_handler![
|
| 51 |
-
settings::phase0_status, settings::board_load_state, settings::board_save_state, settings::board_export_file, settings::board_import_file, settings::screen_capture_full, settings::screen_capture_region, settings::screen_capture_window_region,
|
| 52 |
-
history::history_list, history::history_clear,
|
| 53 |
-
refs_format::refs_export, refs_format::refs_import,
|
| 54 |
-
projects::projects_list, projects::projects_get_active_id, projects::project_create, projects::project_save, projects::project_load, projects::project_delete, projects::project_rename,
|
| 55 |
-
browser::capture::browser_capture_viewport, browser::capture::browser_capture_clip, browser::capture::browser_capture_full_page,
|
| 56 |
-
browser::autofill::tab_autofill,
|
| 57 |
-
browser::commands::browser_init, browser::commands::browser_set_visible, browser::commands::tab_create, browser::commands::tab_activate, browser::commands::tab_close, browser::commands::tab_restore, browser::commands::tab_navigate, browser::commands::tab_reload, browser::commands::tab_back, browser::commands::tab_forward, browser::commands::tab_zoom, browser::commands::tab_resize, browser::commands::tab_get_all, browser::commands::tab_pin, browser::commands::tab_find, browser::commands::tab_find_clear,
|
| 58 |
-
browser::context_menu::browser_context_menu,
|
| 59 |
-
adblock::commands::shield_get_report, adblock::commands::shield_check_url, adblock::commands::shield_cosmetic_css, adblock::commands::shield_toggle_domain, adblock::commands::shield_is_allowed, adblock::commands::shield_update_lists, adblock::commands::shield_add_user_rule, adblock::commands::shield_list_subscriptions,
|
| 60 |
-
library::library_add_item, library::library_load, library::library_items, library::library_search, library::library_remove_item, library::library_add_tag,
|
| 61 |
-
board::board_list, board::board_current, board::board_create, board::board_open, board::board_save_as, board::board_load, board::board_items, board::board_add_image, board::board_add_note, board::board_add_palette, board::board_extract_palette_from_item, board::board_add_palette_from_item, board::board_update_item, board::board_delete_item,
|
| 62 |
-
sessions::sessions_save, sessions::sessions_load, sessions::sessions_list, sessions::sessions_auto_save, sessions::sessions_delete, sessions::sessions_rename,
|
| 63 |
-
downloads::downloads_list, downloads::downloads_clear_completed, downloads::download_to_library, downloads::web_clip_page,
|
| 64 |
-
credentials::credentials_list, credentials::credentials_generate_password,
|
| 65 |
-
study::study_start, study::study_complete, study::study_list,
|
| 66 |
-
color_tools::color_export, color_tools::color_search_library,
|
| 67 |
-
])
|
| 68 |
-
.setup(|app| {
|
| 69 |
-
#[cfg(desktop)]
|
| 70 |
-
app.handle().plugin(tauri_plugin_global_shortcut::Builder::new().build())?;
|
| 71 |
-
if let Ok(zoom_mem) = crate::persistence::load_json::<std::collections::HashMap<String, f64>>(app.handle(), "zoom_memory.json") {
|
| 72 |
-
if !zoom_mem.is_empty() { let app_state = app.state::<AppState>(); let mut tabs = app_state.tabs.lock().expect("tabs lock"); tabs.zoom_memory = zoom_mem; }
|
| 73 |
-
}
|
| 74 |
-
adblock::updater::spawn_updater(app.handle().clone());
|
| 75 |
-
Ok(())
|
| 76 |
-
})
|
| 77 |
-
.run(tauri::generate_context!())
|
| 78 |
-
.expect("error while running Refstudio");
|
| 79 |
-
}
|
| 80 |
-
|
| 81 |
-
fn migrations() -> Vec<Migration> {
|
| 82 |
-
vec![
|
| 83 |
-
Migration { version: 1, description: "phase0_init", sql: include_str!("../migrations/001_phase0_init.sql"), kind: MigrationKind::Up },
|
| 84 |
-
Migration { version: 2, description: "phase3_tables", sql: include_str!("../migrations/002_phase3_tables.sql"), kind: MigrationKind::Up },
|
| 85 |
-
]
|
| 86 |
-
}
|
| 87 |
-
|
| 88 |
-
fn percent_decode(s: &str) -> String { let bytes = s.as_bytes(); let mut out = Vec::with_capacity(bytes.len()); let mut i = 0; while i < bytes.len() { if bytes[i] == b'%' && i + 2 < bytes.len() { if let Ok(hex) = std::str::from_utf8(&bytes[i+1..i+3]) { if let Ok(v) = u8::from_str_radix(hex, 16) { out.push(v); i += 3; continue; } } } out.push(if bytes[i] == b'+' { b' ' } else { bytes[i] }); i += 1; } String::from_utf8_lossy(&out).to_string() }
|
|
|
|
| 1 |
+
mod adblock;
|
| 2 |
+
mod browser;
|
| 3 |
+
mod credentials;
|
| 4 |
+
mod library;
|
| 5 |
+
mod board;
|
| 6 |
+
mod color_tools;
|
| 7 |
+
mod persistence;
|
| 8 |
+
mod sessions;
|
| 9 |
+
mod study;
|
| 10 |
+
mod downloads;
|
| 11 |
+
mod settings;
|
| 12 |
+
mod state;
|
| 13 |
+
mod history;
|
| 14 |
+
mod projects;
|
| 15 |
+
mod refs_format;
|
| 16 |
+
|
| 17 |
+
use crate::state::AppState;
|
| 18 |
+
use tauri::{Emitter, Manager};
|
| 19 |
+
use tauri_plugin_sql::{Migration, MigrationKind};
|
| 20 |
+
|
| 21 |
+
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
| 22 |
+
pub fn run() {
|
| 23 |
+
tauri::Builder::default()
|
| 24 |
+
.plugin(tauri_plugin_opener::init())
|
| 25 |
+
.plugin(tauri_plugin_store::Builder::default().build())
|
| 26 |
+
.plugin(tauri_plugin_fs::init())
|
| 27 |
+
.plugin(tauri_plugin_clipboard_manager::init())
|
| 28 |
+
.plugin(tauri_plugin_sql::Builder::default().add_migrations("sqlite:muse_alpha_v2.db", migrations()).build())
|
| 29 |
+
.plugin(tauri_plugin_stronghold::Builder::new(|password| { let salt = b"muse-vault-kdf-salt-2026-v1-prod"; let mut key = [0u8; 32]; argon2::Argon2::default().hash_password_into(password.as_bytes(), salt, &mut key).expect("argon2 KDF failed"); key.to_vec() }).build())
|
| 30 |
+
.register_uri_scheme_protocol("muse-action", |ctx, request| {
|
| 31 |
+
let uri = request.uri().to_string();
|
| 32 |
+
let app = ctx.app_handle().clone();
|
| 33 |
+
let action = uri.split("://").nth(1).unwrap_or("").split('?').next().unwrap_or("").to_string();
|
| 34 |
+
let query = uri.split('?').nth(1).unwrap_or("");
|
| 35 |
+
let params: std::collections::HashMap<String, String> = query.split('&').filter_map(|pair| { let (k, v) = pair.split_once('=')?; Some((percent_decode(k), percent_decode(v))) }).collect();
|
| 36 |
+
match action.as_str() {
|
| 37 |
+
"library" => { let url = params.get("url").cloned().unwrap_or_default(); if !url.is_empty() { let source = params.get("source").cloned(); let title = params.get("title").cloned(); tauri::async_runtime::spawn(async move { let _ = crate::library::library_add_item(app, url, source, title).await; }); } }
|
| 38 |
+
"board" => { let url = params.get("url").cloned().unwrap_or_default(); if !url.is_empty() { let source = params.get("source").cloned(); let title = params.get("title").cloned(); tauri::async_runtime::spawn(async move { if let Ok(item) = crate::library::library_add_item(app.clone(), url, source, title).await { let _ = crate::board::board_add_image(app, Some(item.id), item.data_url, 120.0, 120.0, 300.0, 200.0); } }); } }
|
| 39 |
+
"vault" => { let va = params.get("action").cloned().unwrap_or_default(); match va.as_str() { "save-prompt" => { let _ = app.emit("vault://save-prompt", serde_json::json!({"origin": params.get("origin").cloned().unwrap_or_default(), "username": params.get("username").cloned().unwrap_or_default(), "password": params.get("password").cloned().unwrap_or_default()})); } "has-login-form" => { let _ = app.emit("vault://login-detected", serde_json::json!({"origin": params.get("origin").cloned().unwrap_or_default(), "fields": params.get("fields").cloned().unwrap_or_default()})); } _ => {} } }
|
| 40 |
+
_ => {}
|
| 41 |
+
}
|
| 42 |
+
tauri::http::Response::builder().status(200).header("Access-Control-Allow-Origin", "*").body(Vec::new()).unwrap()
|
| 43 |
+
})
|
| 44 |
+
.manage(state::AppState::default())
|
| 45 |
+
.manage(adblock::engine::AdBlockState::new())
|
| 46 |
+
.manage(library::LibraryState::default())
|
| 47 |
+
.manage(board::BoardState::default())
|
| 48 |
+
.manage(downloads::DownloadState::default())
|
| 49 |
+
.manage(study::StudyState::default())
|
| 50 |
+
.invoke_handler(tauri::generate_handler![
|
| 51 |
+
settings::phase0_status, settings::board_load_state, settings::board_save_state, settings::board_export_file, settings::board_import_file, settings::screen_capture_full, settings::screen_capture_region, settings::screen_capture_window_region,
|
| 52 |
+
history::history_list, history::history_clear,
|
| 53 |
+
refs_format::refs_export, refs_format::refs_import,
|
| 54 |
+
projects::projects_list, projects::projects_get_active_id, projects::project_create, projects::project_save, projects::project_load, projects::project_delete, projects::project_rename,
|
| 55 |
+
browser::capture::browser_capture_viewport, browser::capture::browser_capture_clip, browser::capture::browser_capture_full_page,
|
| 56 |
+
browser::autofill::tab_autofill,
|
| 57 |
+
browser::commands::browser_init, browser::commands::browser_set_visible, browser::commands::browser_hide_all, browser::commands::tab_create, browser::commands::tab_activate, browser::commands::tab_close, browser::commands::tab_restore, browser::commands::tab_navigate, browser::commands::tab_reload, browser::commands::tab_back, browser::commands::tab_forward, browser::commands::tab_zoom, browser::commands::tab_resize, browser::commands::tab_get_all, browser::commands::tab_pin, browser::commands::tab_find, browser::commands::tab_find_clear,
|
| 58 |
+
browser::context_menu::browser_context_menu,
|
| 59 |
+
adblock::commands::shield_get_report, adblock::commands::shield_check_url, adblock::commands::shield_cosmetic_css, adblock::commands::shield_toggle_domain, adblock::commands::shield_is_allowed, adblock::commands::shield_update_lists, adblock::commands::shield_add_user_rule, adblock::commands::shield_list_subscriptions,
|
| 60 |
+
library::library_add_item, library::library_load, library::library_items, library::library_search, library::library_remove_item, library::library_add_tag,
|
| 61 |
+
board::board_list, board::board_current, board::board_create, board::board_open, board::board_save_as, board::board_load, board::board_items, board::board_add_image, board::board_add_note, board::board_add_palette, board::board_extract_palette_from_item, board::board_add_palette_from_item, board::board_update_item, board::board_delete_item,
|
| 62 |
+
sessions::sessions_save, sessions::sessions_load, sessions::sessions_list, sessions::sessions_auto_save, sessions::sessions_delete, sessions::sessions_rename,
|
| 63 |
+
downloads::downloads_list, downloads::downloads_clear_completed, downloads::download_to_library, downloads::web_clip_page,
|
| 64 |
+
credentials::credentials_list, credentials::credentials_generate_password,
|
| 65 |
+
study::study_start, study::study_complete, study::study_list,
|
| 66 |
+
color_tools::color_export, color_tools::color_search_library,
|
| 67 |
+
])
|
| 68 |
+
.setup(|app| {
|
| 69 |
+
#[cfg(desktop)]
|
| 70 |
+
app.handle().plugin(tauri_plugin_global_shortcut::Builder::new().build())?;
|
| 71 |
+
if let Ok(zoom_mem) = crate::persistence::load_json::<std::collections::HashMap<String, f64>>(app.handle(), "zoom_memory.json") {
|
| 72 |
+
if !zoom_mem.is_empty() { let app_state = app.state::<AppState>(); let mut tabs = app_state.tabs.lock().expect("tabs lock"); tabs.zoom_memory = zoom_mem; }
|
| 73 |
+
}
|
| 74 |
+
adblock::updater::spawn_updater(app.handle().clone());
|
| 75 |
+
Ok(())
|
| 76 |
+
})
|
| 77 |
+
.run(tauri::generate_context!())
|
| 78 |
+
.expect("error while running Refstudio");
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
fn migrations() -> Vec<Migration> {
|
| 82 |
+
vec![
|
| 83 |
+
Migration { version: 1, description: "phase0_init", sql: include_str!("../migrations/001_phase0_init.sql"), kind: MigrationKind::Up },
|
| 84 |
+
Migration { version: 2, description: "phase3_tables", sql: include_str!("../migrations/002_phase3_tables.sql"), kind: MigrationKind::Up },
|
| 85 |
+
]
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
fn percent_decode(s: &str) -> String { let bytes = s.as_bytes(); let mut out = Vec::with_capacity(bytes.len()); let mut i = 0; while i < bytes.len() { if bytes[i] == b'%' && i + 2 < bytes.len() { if let Ok(hex) = std::str::from_utf8(&bytes[i+1..i+3]) { if let Ok(v) = u8::from_str_radix(hex, 16) { out.push(v); i += 3; continue; } } } out.push(if bytes[i] == b'+' { b' ' } else { bytes[i] }); i += 1; } String::from_utf8_lossy(&out).to_string() }
|