Skip to main content

DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_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;
13
14use crate::{
15	RPC::CocoonService::CocoonServiceImpl,
16	Vine::Generated::{CreateWebviewPanelRequest, CreateWebviewPanelResponse},
17	dev_log,
18};
19
20pub async fn Fn(
21	Service:&CocoonServiceImpl,
22
23	Request:CreateWebviewPanelRequest,
24) -> Result<Response<CreateWebviewPanelResponse>, Status> {
25	dev_log!(
26		"cocoon",
27		"[CocoonService] create_webview_panel: view_type={} title={}",
28		Request.view_type,
29		Request.title
30	);
31
32	let Handle = match Service
33		.environment
34		.CreateWebviewPanel(
35			json!({}),
36			Request.view_type.clone(),
37			Request.title.clone(),
38			json!({ "viewColumn": Request.view_column, "preserveFocus": Request.preserve_focus }),
39			json!({}),
40			json!({}),
41		)
42		.await
43	{
44		Ok(H) => H,
45
46		Err(Error) => {
47			dev_log!("cocoon", "warn: [CocoonService] create_webview_panel trait failed: {}", Error);
48
49			let Fallback = SystemTime::now()
50				.duration_since(UNIX_EPOCH)
51				.map(|D| D.as_millis() as u32)
52				.unwrap_or(0);
53
54			let _ = Service.environment.ApplicationHandle.emit(
55				"sky://webview/create",
56				json!({
57					"handle": Fallback,
58					"viewType": Request.view_type,
59					"title": Request.title,
60					"viewColumn": Request.view_column,
61					"preserveFocus": Request.preserve_focus,
62					"iconPath": Request.icon_path,
63				}),
64			);
65
66			return Ok(Response::new(CreateWebviewPanelResponse { handle:Fallback }));
67		},
68	};
69
70	let HandleU32 = Handle
71		.parse::<u32>()
72		.unwrap_or_else(|_| Handle.chars().map(|C| C as u32).fold(0u32, |Acc, Char| Acc.wrapping_add(Char)));
73
74	Ok(Response::new(CreateWebviewPanelResponse { handle:HandleU32 }))
75}