Skip to main content

Mountain/RPC/CocoonService/Window/
CreateWebviewPanel.rs

1#![allow(non_snake_case)]
2
3//! Register a webview panel through the `WebviewProvider` trait so the
4//! panel is tracked in `ApplicationState::WebviewState`. Without trait
5//! registration `DisposeWebviewPanel` later fails with "unknown handle"
6//! and webviews leak DOM. Falls back to a millisecond pseudo-handle and
7//! a direct Sky emit on trait failure.
8
9use std::time::{SystemTime, UNIX_EPOCH};
10
11use serde_json::json;
12use tauri::Emitter;
13use tonic::{Response, Status};
14use CommonLibrary::Webview::WebviewProvider::WebviewProvider;
15
16use crate::{
17	RPC::CocoonService::CocoonServiceImpl,
18	Vine::Generated::{CreateWebviewPanelRequest, CreateWebviewPanelResponse},
19	dev_log,
20};
21
22pub async fn Fn(
23	Service:&CocoonServiceImpl,
24	Request:CreateWebviewPanelRequest,
25) -> Result<Response<CreateWebviewPanelResponse>, Status> {
26	dev_log!(
27		"cocoon",
28		"[CocoonService] create_webview_panel: view_type={} title={}",
29		Request.view_type,
30		Request.title
31	);
32
33	let Handle = match Service
34		.environment
35		.CreateWebviewPanel(
36			json!({}),
37			Request.view_type.clone(),
38			Request.title.clone(),
39			json!({ "viewColumn": Request.view_column, "preserveFocus": Request.preserve_focus }),
40			json!({}),
41			json!({}),
42		)
43		.await
44	{
45		Ok(H) => H,
46		Err(Error) => {
47			dev_log!("cocoon", "warn: [CocoonService] create_webview_panel trait failed: {}", Error);
48			let Fallback = SystemTime::now()
49				.duration_since(UNIX_EPOCH)
50				.map(|D| D.as_millis() as u32)
51				.unwrap_or(0);
52			let _ = Service.environment.ApplicationHandle.emit(
53				"sky://webview/create",
54				json!({
55					"handle": Fallback,
56					"viewType": Request.view_type,
57					"title": Request.title,
58					"viewColumn": Request.view_column,
59					"preserveFocus": Request.preserve_focus,
60					"iconPath": Request.icon_path,
61				}),
62			);
63			return Ok(Response::new(CreateWebviewPanelResponse { handle:Fallback }));
64		},
65	};
66
67	let HandleU32 = Handle
68		.parse::<u32>()
69		.unwrap_or_else(|_| Handle.chars().map(|C| C as u32).fold(0u32, |Acc, Char| Acc.wrapping_add(Char)));
70
71	Ok(Response::new(CreateWebviewPanelResponse { handle:HandleU32 }))
72}