✨ 支持pake内的页面下载功能
This commit is contained in:
102
src-tauri/Cargo.lock
generated
102
src-tauri/Cargo.lock
generated
@@ -42,6 +42,7 @@ checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61"
|
|||||||
name = "app"
|
name = "app"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"dirs",
|
||||||
"home",
|
"home",
|
||||||
"image",
|
"image",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -50,7 +51,7 @@ dependencies = [
|
|||||||
"tauri-build",
|
"tauri-build",
|
||||||
"tauri-utils",
|
"tauri-utils",
|
||||||
"webbrowser",
|
"webbrowser",
|
||||||
"wry",
|
"wry 0.24.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -2535,6 +2536,63 @@ dependencies = [
|
|||||||
"x11-dl",
|
"x11-dl",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tao"
|
||||||
|
version = "0.16.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "704522803dda895767f69198af8351b0a3f4fe2e293c3ca54cce0ecba05a97f2"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
"cairo-rs",
|
||||||
|
"cc",
|
||||||
|
"cocoa",
|
||||||
|
"core-foundation",
|
||||||
|
"core-graphics",
|
||||||
|
"crossbeam-channel",
|
||||||
|
"dispatch",
|
||||||
|
"gdk",
|
||||||
|
"gdk-pixbuf",
|
||||||
|
"gdk-sys",
|
||||||
|
"gdkx11-sys",
|
||||||
|
"gio",
|
||||||
|
"glib",
|
||||||
|
"glib-sys",
|
||||||
|
"gtk",
|
||||||
|
"image",
|
||||||
|
"instant",
|
||||||
|
"jni",
|
||||||
|
"lazy_static",
|
||||||
|
"libc",
|
||||||
|
"log",
|
||||||
|
"ndk",
|
||||||
|
"ndk-context",
|
||||||
|
"ndk-sys",
|
||||||
|
"objc",
|
||||||
|
"once_cell",
|
||||||
|
"parking_lot",
|
||||||
|
"png",
|
||||||
|
"raw-window-handle",
|
||||||
|
"scopeguard",
|
||||||
|
"serde",
|
||||||
|
"tao-macros",
|
||||||
|
"unicode-segmentation",
|
||||||
|
"uuid 1.2.2",
|
||||||
|
"windows 0.39.0",
|
||||||
|
"windows-implement",
|
||||||
|
"x11-dl",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tao-macros"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3b6fcd8245d45a39ffc8715183d92ae242750eb57b285eb3bcd63dfd512afd09"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tar"
|
name = "tar"
|
||||||
version = "0.4.38"
|
version = "0.4.38"
|
||||||
@@ -2683,7 +2741,7 @@ dependencies = [
|
|||||||
"webkit2gtk",
|
"webkit2gtk",
|
||||||
"webview2-com",
|
"webview2-com",
|
||||||
"windows 0.39.0",
|
"windows 0.39.0",
|
||||||
"wry",
|
"wry 0.23.4",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -3438,7 +3496,45 @@ dependencies = [
|
|||||||
"serde_json",
|
"serde_json",
|
||||||
"sha2",
|
"sha2",
|
||||||
"soup2",
|
"soup2",
|
||||||
"tao",
|
"tao 0.15.8",
|
||||||
|
"thiserror",
|
||||||
|
"url",
|
||||||
|
"webkit2gtk",
|
||||||
|
"webkit2gtk-sys",
|
||||||
|
"webview2-com",
|
||||||
|
"windows 0.39.0",
|
||||||
|
"windows-implement",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wry"
|
||||||
|
version = "0.24.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1c846dc4dda988e959869dd0802cd27417c9696e584593e49178aeee28890d25"
|
||||||
|
dependencies = [
|
||||||
|
"base64",
|
||||||
|
"block",
|
||||||
|
"cocoa",
|
||||||
|
"core-graphics",
|
||||||
|
"crossbeam-channel",
|
||||||
|
"dunce",
|
||||||
|
"gdk",
|
||||||
|
"gio",
|
||||||
|
"glib",
|
||||||
|
"gtk",
|
||||||
|
"html5ever",
|
||||||
|
"http",
|
||||||
|
"kuchiki",
|
||||||
|
"libc",
|
||||||
|
"log",
|
||||||
|
"objc",
|
||||||
|
"objc_id",
|
||||||
|
"once_cell",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"sha2",
|
||||||
|
"soup2",
|
||||||
|
"tao 0.16.0",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"url",
|
"url",
|
||||||
"webkit2gtk",
|
"webkit2gtk",
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ image = "0.24.5"
|
|||||||
home = "0.5"
|
home = "0.5"
|
||||||
tauri-utils = "1.2.1"
|
tauri-utils = "1.2.1"
|
||||||
webbrowser = "0.8.2"
|
webbrowser = "0.8.2"
|
||||||
wry = "0.23.4"
|
wry = "0.24.1"
|
||||||
|
dirs = "4.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
# by default Tauri runs in production mode
|
# by default Tauri runs in production mode
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
// at the top of main.rs - that will prevent the console from showing
|
// at the top of main.rs - that will prevent the console from showing
|
||||||
#![windows_subsystem = "windows"]
|
#![windows_subsystem = "windows"]
|
||||||
extern crate image;
|
extern crate image;
|
||||||
|
use dirs::download_dir;
|
||||||
|
use std::path::PathBuf;
|
||||||
use tauri_utils::config::{Config, WindowConfig};
|
use tauri_utils::config::{Config, WindowConfig};
|
||||||
use wry::{
|
use wry::{
|
||||||
application::{
|
application::{
|
||||||
@@ -12,9 +14,10 @@ use wry::{
|
|||||||
webview::WebViewBuilder,
|
webview::WebViewBuilder,
|
||||||
};
|
};
|
||||||
|
|
||||||
// enum UserEvent {
|
enum UserEvent {
|
||||||
// NewWindow(String),
|
DownloadStarted(String, String),
|
||||||
// }
|
DownloadComplete(Option<PathBuf>, bool),
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
use wry::application::{
|
use wry::application::{
|
||||||
@@ -87,9 +90,8 @@ fn main() -> wry::Result<()> {
|
|||||||
..
|
..
|
||||||
} = get_windows_config().1.unwrap_or_default();
|
} = get_windows_config().1.unwrap_or_default();
|
||||||
|
|
||||||
// let event_loop: EventLoop<UserEvent> = EventLoop::with_user_event();
|
let event_loop: EventLoop<UserEvent> = EventLoop::with_user_event();
|
||||||
// let proxy = event_loop.create_proxy();
|
let proxy = event_loop.create_proxy();
|
||||||
let event_loop = EventLoop::new();
|
|
||||||
let common_window = WindowBuilder::new()
|
let common_window = WindowBuilder::new()
|
||||||
.with_title("")
|
.with_title("")
|
||||||
.with_resizable(resizable)
|
.with_resizable(resizable)
|
||||||
@@ -103,7 +105,7 @@ fn main() -> wry::Result<()> {
|
|||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
let window = {
|
let window = {
|
||||||
let mut icon_path = format!("png/{}_32.ico", package_name);
|
let mut icon_path = format!("png/{}_32.ico", package_name);
|
||||||
// 假如没有设置,就使用默认的即可
|
// If there is no setting, use the default one.
|
||||||
if !std::path::Path::new(&icon_path).exists() {
|
if !std::path::Path::new(&icon_path).exists() {
|
||||||
icon_path = "png/icon_32.ico".to_string();
|
icon_path = "png/icon_32.ico".to_string();
|
||||||
}
|
}
|
||||||
@@ -128,6 +130,7 @@ fn main() -> wry::Result<()> {
|
|||||||
.build(&event_loop)
|
.build(&event_loop)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
// Handling events of JS -> Rust
|
||||||
let handler = move |window: &Window, req: String| {
|
let handler = move |window: &Window, req: String| {
|
||||||
if req == "drag_window" {
|
if req == "drag_window" {
|
||||||
let _ = window.drag_window();
|
let _ = window.drag_window();
|
||||||
@@ -140,7 +143,31 @@ fn main() -> wry::Result<()> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 用于欺骗部分页面对于浏览器的强检测
|
let download_started = {
|
||||||
|
let proxy = proxy.clone();
|
||||||
|
move |uri: String, default_path: &mut PathBuf| {
|
||||||
|
let path = download_dir()
|
||||||
|
.unwrap()
|
||||||
|
.join(default_path.display().to_string())
|
||||||
|
.as_path()
|
||||||
|
.to_path_buf();
|
||||||
|
*default_path = path.clone();
|
||||||
|
let submitted = proxy
|
||||||
|
.send_event(UserEvent::DownloadStarted(
|
||||||
|
uri.clone(),
|
||||||
|
path.display().to_string(),
|
||||||
|
))
|
||||||
|
.is_ok();
|
||||||
|
return submitted;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let download_completed = {
|
||||||
|
let proxy = proxy.clone();
|
||||||
|
move |_uri, path, success| {
|
||||||
|
let _ = proxy.send_event(UserEvent::DownloadComplete(path, success));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
let webview = {
|
let webview = {
|
||||||
@@ -151,11 +178,9 @@ fn main() -> wry::Result<()> {
|
|||||||
.with_devtools(cfg!(feature = "devtools"))
|
.with_devtools(cfg!(feature = "devtools"))
|
||||||
.with_initialization_script(include_str!("pake.js"))
|
.with_initialization_script(include_str!("pake.js"))
|
||||||
.with_ipc_handler(handler)
|
.with_ipc_handler(handler)
|
||||||
// .with_new_window_req_handler(move |uri: String| {
|
|
||||||
// let submitted = proxy.send_event(UserEvent::NewWindow(uri.clone())).is_ok();
|
|
||||||
// submitted
|
|
||||||
// })
|
|
||||||
.with_back_forward_navigation_gestures(true)
|
.with_back_forward_navigation_gestures(true)
|
||||||
|
.with_download_started_handler(download_started)
|
||||||
|
.with_download_completed_handler(download_completed)
|
||||||
.build()?
|
.build()?
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -185,10 +210,8 @@ fn main() -> wry::Result<()> {
|
|||||||
.with_initialization_script(include_str!("pake.js"))
|
.with_initialization_script(include_str!("pake.js"))
|
||||||
.with_ipc_handler(handler)
|
.with_ipc_handler(handler)
|
||||||
.with_web_context(&mut web_content)
|
.with_web_context(&mut web_content)
|
||||||
// .with_new_window_req_handler(move |uri: String| {
|
.with_download_started_handler(download_started)
|
||||||
// let submitted = proxy.send_event(UserEvent::NewWindow(uri.clone())).is_ok();
|
.with_download_completed_handler(download_completed)
|
||||||
// submitted
|
|
||||||
// })
|
|
||||||
.build()?
|
.build()?
|
||||||
};
|
};
|
||||||
#[cfg(feature = "devtools")]
|
#[cfg(feature = "devtools")]
|
||||||
@@ -217,9 +240,18 @@ fn main() -> wry::Result<()> {
|
|||||||
println!("Clicked on {:?}", menu_id);
|
println!("Clicked on {:?}", menu_id);
|
||||||
println!("Clicked on {:?}", webview.window().is_visible());
|
println!("Clicked on {:?}", webview.window().is_visible());
|
||||||
}
|
}
|
||||||
// Event::UserEvent(UserEvent::NewWindow(uri)) => {
|
Event::UserEvent(UserEvent::DownloadStarted(uri, temp_dir)) => {
|
||||||
// webbrowser::open(&uri).expect("no browser");
|
println!("Download: {}", uri);
|
||||||
// }
|
println!("Will write to: {:?}", temp_dir);
|
||||||
|
}
|
||||||
|
Event::UserEvent(UserEvent::DownloadComplete(_, success)) => {
|
||||||
|
println!("Succeeded: {}", success);
|
||||||
|
if success {
|
||||||
|
let _ = webview.evaluate_script("window.Toast('Save in downloads folder')");
|
||||||
|
} else {
|
||||||
|
println!("No output path")
|
||||||
|
}
|
||||||
|
}
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
16
src-tauri/src/pake.js
vendored
16
src-tauri/src/pake.js
vendored
@@ -367,3 +367,19 @@ function zoomIn() {
|
|||||||
function zoomOut() {
|
function zoomOut() {
|
||||||
zoomCommon((htmlZoom) => `${Math.max(parseInt(htmlZoom) - 10, 30)}%`);
|
zoomCommon((htmlZoom) => `${Math.max(parseInt(htmlZoom) - 10, 30)}%`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function Toast(msg) {
|
||||||
|
const m = document.createElement('div');
|
||||||
|
m.innerHTML = msg;
|
||||||
|
m.style.cssText = "max-width:60%;min-width: 180px;padding:0 8px;height: 36px;color: rgb(255, 255, 255);line-height: 36px;text-align: center;border-radius: 4px;position: fixed;bottom:16px;right: 16px;transform: translate(-50%, -50%);z-index: 999999;background: rgba(0, 0, 0,.9);font-size: 14px;";
|
||||||
|
document.body.appendChild(m);
|
||||||
|
setTimeout(function() {
|
||||||
|
m.style.transition = 'transform ' + d + 's ease-in, opacity ' + d + 's ease-in';
|
||||||
|
m.style.opacity = '0';
|
||||||
|
setTimeout(function() {
|
||||||
|
document.body.removeChild(m)
|
||||||
|
}, 500);
|
||||||
|
}, 3000);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user