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