支持pake内的页面下载功能

This commit is contained in:
Tw93
2023-01-13 23:50:21 +08:00
parent 1e63958015
commit d18389e361
4 changed files with 168 additions and 23 deletions

102
src-tauri/Cargo.lock generated
View File

@@ -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",

View File

@@ -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

View File

@@ -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
View File

@@ -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);
}