Veröffentlichte Quellen
Quellen als ZIP herunterladen
CH-J Tools
Durchsuchen Sie Verzeichnisse und Dateien einer bestimmten Anwendungsausgabe.
CH-J / Server Manager
872 Dateien
core-20261030T220507Z-61e4558d889f
Hinzugefügt: · Erstellt:
1
//! Test-only UI automation sink (cargo feature `smoke`, never in release builds).3
use serde_json::Value;4
use std::io::Write;5
use tauri::Manager;7
#[tauri::command]8
pub fn smoke_report(webview: tauri::Webview, payload: Option<Value>) -> Result<Value, crate::core::error::CoreError> {9
let Ok(path) = std::env::var("CHJ_SMOKE_OUT") else { return Ok(Value::Null) };10
let line = serde_json::json!({ "window": webview.label(), "at": chrono::Utc::now().to_rfc3339(), "report": payload });11
if let Ok(mut file) = std::fs::OpenOptions::new().create(true).append(true).open(path) {12
let _ = writeln!(file, "{line}");13
}14
if payload.as_ref().and_then(|p| p.get("exit")).and_then(Value::as_bool) == Some(true) {15
webview.app_handle().exit(0);16
}17
Ok(Value::Null)18
}20
/// PNG of this window's web content, without any screen-recording permission and also when the21
/// window is covered. Writes only below `CHJ_SMOKE_SHOTS`.22
#[tauri::command]23
pub async fn smoke_snapshot(webview: tauri::Webview, window: tauri::Window, payload: Option<Value>) -> Result<Value, crate::core::error::CoreError> {24
use crate::core::error::CoreError;25
let payload = payload.unwrap_or_default();26
let root = std::env::var("CHJ_SMOKE_SHOTS").map_err(|_| CoreError::plain("CHJ_SMOKE_SHOTS is not set."))?;27
let name = payload["name"].as_str().filter(|n| !n.is_empty() && !n.contains("..") && !n.starts_with('/')).ok_or_else(|| CoreError::plain("Invalid snapshot name."))?;28
let path = std::path::Path::new(&root).join(name);29
if let Some(parent) = path.parent() {30
std::fs::create_dir_all(parent)?;31
}32
if let (Some(width), Some(height)) = (payload["width"].as_f64(), payload["height"].as_f64()) {33
let _ = window.set_size(tauri::LogicalSize::new(width, height));34
tokio::time::sleep(std::time::Duration::from_millis(500)).await;35
}36
capture(&webview, path).await37
}39
#[cfg(target_os = "macos")]40
async fn capture(webview: &tauri::Webview, path: std::path::PathBuf) -> Result<Value, crate::core::error::CoreError> {41
use crate::core::error::CoreError;42
use objc2_app_kit::{NSBitmapImageFileType, NSBitmapImageRep, NSImage};43
use objc2_foundation::{NSDictionary, NSError};44
use objc2_web_kit::WKWebView;45
let (sender, receiver) = tokio::sync::oneshot::channel::<Result<Vec<u8>, String>>();46
let sender = std::sync::Mutex::new(Some(sender));47
webview48
.with_webview(move |platform| unsafe {49
let view: &WKWebView = &*platform.inner().cast::<WKWebView>();50
let block = block2::RcBlock::new(move |image: *mut NSImage, _error: *mut NSError| {51
let png = image.as_ref().and_then(|image| image.TIFFRepresentation()).and_then(|tiff| NSBitmapImageRep::imageRepWithData(&tiff)).and_then(|rep| rep.representationUsingType_properties(NSBitmapImageFileType::PNG, &NSDictionary::new())).map(|data| data.to_vec());52
if let Some(sender) = sender.lock().unwrap().take() {53
let _ = sender.send(png.ok_or_else(|| "The web view returned no image.".to_string()));54
}55
});56
view.takeSnapshotWithConfiguration_completionHandler(None, &block);57
})58
.map_err(|error| CoreError::plain(&error.to_string()))?;59
let bytes = receiver.await.map_err(|_| CoreError::plain("The snapshot was not delivered."))?.map_err(|message| CoreError::plain(&message))?;60
std::fs::write(&path, &bytes)?;61
Ok(serde_json::json!({ "bytes": bytes.len() }))62
}64
#[cfg(not(target_os = "macos"))]65
async fn capture(_webview: &tauri::Webview, _path: std::path::PathBuf) -> Result<Value, crate::core::error::CoreError> {66
Err(crate::core::error::CoreError::plain("Screenshots are taken on macOS."))67
}SHA-256
009fa0eb4f57bcc71dd99b5aa4317ce31902a301f473dd75a89eea151b060b78CH-J Proprietary Software License 1.14 · Die Quellen werden unter der CH-J Proprietary Software License 1.14 bereitgestellt. Ihre Verfügbarkeit ändert die Lizenzbedingungen nicht und gewährt keine zusätzlichen Rechte.
SHA-256 des Archivs
77380d4805485ffa4027fbe7858b5836f197a4aa9d52358a43e2d12d018744df