From d2c8f0eb5ce2a5ebacd857614b7c89bbd5c9dca4 Mon Sep 17 00:00:00 2001 From: mattyg Date: Thu, 16 Jan 2025 18:37:41 -0700 Subject: [PATCH] fix: run tauri's internal init scripts before user's scripts (#12424) --- .changes/initialization_scripts_order.md | 5 +++ crates/tauri/src/manager/webview.rs | 55 ++++++++++++++---------- 2 files changed, 37 insertions(+), 23 deletions(-) create mode 100644 .changes/initialization_scripts_order.md diff --git a/.changes/initialization_scripts_order.md b/.changes/initialization_scripts_order.md new file mode 100644 index 000000000..5e3b36af5 --- /dev/null +++ b/.changes/initialization_scripts_order.md @@ -0,0 +1,5 @@ +--- +'tauri': 'patch:bug' +--- + +Ensure that tauri's builtin initialization scripts and plugin initialization scripts are executed before any user-added initialization scripts in a webview. diff --git a/crates/tauri/src/manager/webview.rs b/crates/tauri/src/manager/webview.rs index 8773600dc..99522442a 100644 --- a/crates/tauri/src/manager/webview.rs +++ b/crates/tauri/src/manager/webview.rs @@ -150,9 +150,9 @@ impl WebviewManager { } .render_default(&Default::default())?; - webview_attributes = webview_attributes - .initialization_script( - r" + let mut all_initialization_scripts: Vec = vec![]; + all_initialization_scripts.push( + r" Object.defineProperty(window, 'isTauri', { value: true, }); @@ -164,11 +164,12 @@ impl WebviewManager { } }) } - ", - ) - .initialization_script(&self.invoke_initialization_script) - .initialization_script(&format!( - r#" + " + .to_string(), + ); + all_initialization_scripts.push(self.invoke_initialization_script.to_string()); + all_initialization_scripts.push(format!( + r#" Object.defineProperty(window.__TAURI_INTERNALS__, 'metadata', {{ value: {{ currentWindow: {{ label: {current_window_label} }}, @@ -176,39 +177,47 @@ impl WebviewManager { }} }}) "#, - current_window_label = serde_json::to_string(window_label)?, - current_webview_label = serde_json::to_string(&label)?, - )) - .initialization_script(&self.initialization_script( - app_manager, - &ipc_init.into_string(), - &pattern_init.into_string(), - is_init_global, - use_https_scheme, - )?); + current_window_label = serde_json::to_string(window_label)?, + current_webview_label = serde_json::to_string(&label)?, + )); + all_initialization_scripts.push( + self + .initialization_script( + app_manager, + &ipc_init.into_string(), + &pattern_init.into_string(), + is_init_global, + use_https_scheme, + )? + .to_string(), + ); for plugin_init_script in plugin_init_scripts { - webview_attributes = webview_attributes.initialization_script(&plugin_init_script); + all_initialization_scripts.push(plugin_init_script.to_string()); } #[cfg(feature = "isolation")] if let crate::Pattern::Isolation { schema, .. } = &*app_manager.pattern { - webview_attributes = webview_attributes.initialization_script( - &IsolationJavascript { + all_initialization_scripts.push( + IsolationJavascript { isolation_src: &crate::pattern::format_real_schema(schema, use_https_scheme), style: tauri_utils::pattern::isolation::IFRAME_STYLE, } .render_default(&Default::default())? - .into_string(), + .to_string(), ); } if let Some(plugin_global_api_scripts) = &*app_manager.plugin_global_api_scripts { for script in plugin_global_api_scripts.iter() { - webview_attributes = webview_attributes.initialization_script(script); + all_initialization_scripts.push(script.to_string()); } } + webview_attributes + .initialization_scripts + .splice(0..0, all_initialization_scripts); + pending.webview_attributes = webview_attributes; let mut registered_scheme_protocols = Vec::new();