Mountain/Track/Effect/CreateEffectForRequest/
Webview.rs1use std::sync::Arc;
25
26use CommonLibrary::{CustomEditor::CustomEditorProvider::CustomEditorProvider, Environment::Requires::Requires};
27use serde_json::{Value, json};
28use tauri::Runtime;
29use url::Url;
30
31use crate::{
32 IPC::SkyEmit::LogSkyEmit,
33 RunTime::ApplicationRunTime::ApplicationRunTime,
34 Track::Effect::{
35 CreateEffectForRequest::Utilities::Params::{str_at, string_at},
36 MappedEffectType::MappedEffect,
37 },
38 dev_log,
39};
40
41pub fn CreateEffect<R:Runtime>(MethodName:&str, Parameters:Value) -> Option<Result<MappedEffect, String>> {
42 match MethodName {
43 "$webview:create"
44 | "webview.create"
45 | "webview.setHtml"
46 | "webview.setOptions"
47 | "webview.postMessage"
48 | "webview.reveal"
49 | "webview.dispose"
50 | "webview.registerView"
51 | "webview.unregisterView"
52 | "webview.registerCustomEditor"
53 | "webview.unregisterCustomEditor" => {
54 dev_log!("ipc", "[WebviewEffect] dispatch-enter method={}", MethodName);
55
56 let Method = MethodName.to_string();
57
58 crate::effect!(run_time, {
59 let Method = Method.clone();
60
61 let RawSuffix = Method.trim_start_matches("$webview:").trim_start_matches("webview.");
62 let Suffix:&str = match RawSuffix {
63 "setHtml" => "set-html",
64 "postMessage" => "postMessage",
65 Other => Other,
66 };
67 let Payload:Value = if Parameters.is_object() {
68 Parameters.clone()
69 } else if let Some(First) = Parameters.get(0) {
70 if First.is_object() {
71 First.clone()
72 } else {
73 let mut Object = serde_json::Map::new();
74 Object.insert("method".to_string(), Value::String(Method.clone()));
75 Object.insert("handle".to_string(), First.clone());
76 Object.insert("args".to_string(), Parameters.clone());
77 if let Some(Second) = Parameters.get(1) {
78 let Alias = match Method.as_str() {
79 "webview.setHtml" => "html",
80 "webview.postMessage" => "message",
81 "webview.registerView" | "webview.unregisterView" => "viewId",
82 "webview.registerCustomEditor"
83 | "webview.unregisterCustomEditor"
84 | "webview.create" => "viewType",
85 _ => "value",
86 };
87 Object.insert(Alias.to_string(), Second.clone());
88 if Method.as_str() == "webview.create" {
89 if let Some(Third) = Parameters.get(2) {
90 Object.insert("title".to_string(), Third.clone());
91 }
92 }
93 }
94 Value::Object(Object)
95 }
96 } else {
97 json!({
98 "method": Method,
99 "handle": Parameters.clone(),
100 })
101 };
102 let EventName = format!("sky://webview/{}", Suffix);
103 if let Err(Error) = LogSkyEmit(&run_time.Environment.ApplicationHandle, &EventName, &Payload) {
104 dev_log!("ipc", "warn: [WebviewEffect] emit {} failed: {}", EventName, Error);
105 }
106 Ok(json!(null))
107 })
108 },
109
110 "$resolveCustomEditor" => {
111 crate::effect!(run_time, {
112 let provider:Arc<dyn CustomEditorProvider> = run_time.Environment.Require();
113 let view_type = string_at(&Parameters, 0);
114 let resource_uri_str = str_at(&Parameters, 1);
115 if resource_uri_str.is_empty() {
124 dev_log!(
125 "grpc",
126 "warn: [$resolveCustomEditor] empty resource URI view_type={}",
127 view_type
128 );
129 return Err(format!("$resolveCustomEditor: empty resource URI for view_type={}", view_type));
130 }
131 let resource_uri = match Url::parse(resource_uri_str) {
132 Ok(u) => u,
133 Err(parse_err) => {
134 dev_log!(
135 "grpc",
136 "warn: [$resolveCustomEditor] invalid URI uri={} err={} view_type={}",
137 resource_uri_str,
138 parse_err,
139 view_type
140 );
141 return Err(format!(
142 "$resolveCustomEditor: invalid resource URI '{}': {}",
143 resource_uri_str, parse_err
144 ));
145 },
146 };
147 let webview_handle = string_at(&Parameters, 2);
148 if webview_handle.is_empty() {
149 dev_log!(
150 "grpc",
151 "warn: [$resolveCustomEditor] empty webview handle uri={} view_type={}",
152 resource_uri_str,
153 view_type
154 );
155 return Err(format!(
156 "$resolveCustomEditor: empty webview handle for view_type={} uri={}",
157 view_type, resource_uri_str
158 ));
159 }
160 provider
161 .ResolveCustomEditor(view_type, resource_uri, webview_handle)
162 .await
163 .map(|_| json!(null))
164 .map_err(|e| e.to_string())
165 })
166 },
167
168 _ => None,
169 }
170}