Skip to main content

Mountain/RPC/CocoonService/Window/
CreateWebviewPanel.rs

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