Skip to main content

Mountain/RPC/CocoonService/Window/
CreateWebviewPanel.rs

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