|
@@ -170,6 +170,8 @@ impl Scope {
|
|
|
|
|
|
#[cfg(test)]
|
|
#[cfg(test)]
|
|
mod tests {
|
|
mod tests {
|
|
|
|
+ use serde::Serialize;
|
|
|
|
+
|
|
use super::RemoteDomainAccessScope;
|
|
use super::RemoteDomainAccessScope;
|
|
use crate::{api::ipc::CallbackFn, test::MockRuntime, App, InvokePayload, Manager, Window};
|
|
use crate::{api::ipc::CallbackFn, test::MockRuntime, App, InvokePayload, Manager, Window};
|
|
|
|
|
|
@@ -186,10 +188,10 @@ mod tests {
|
|
(app, window)
|
|
(app, window)
|
|
}
|
|
}
|
|
|
|
|
|
- fn assert_ipc_response(
|
|
|
|
|
|
+ fn assert_ipc_response<R: Serialize>(
|
|
window: &Window<MockRuntime>,
|
|
window: &Window<MockRuntime>,
|
|
payload: InvokePayload,
|
|
payload: InvokePayload,
|
|
- expected: Result<&str, &str>,
|
|
|
|
|
|
+ expected: Result<R, &str>,
|
|
) {
|
|
) {
|
|
let callback = payload.callback;
|
|
let callback = payload.callback;
|
|
let error = payload.error;
|
|
let error = payload.error;
|
|
@@ -208,8 +210,8 @@ mod tests {
|
|
}
|
|
}
|
|
};
|
|
};
|
|
let (expected_response, fn_name) = match expected {
|
|
let (expected_response, fn_name) = match expected {
|
|
- Ok(payload) => (payload, callback),
|
|
|
|
- Err(payload) => (payload, error),
|
|
|
|
|
|
+ Ok(payload) => (serde_json::to_value(payload).unwrap(), callback),
|
|
|
|
+ Err(payload) => (serde_json::to_value(payload).unwrap(), error),
|
|
};
|
|
};
|
|
let expected = format!(
|
|
let expected = format!(
|
|
"window[\"_{}\"]({})",
|
|
"window[\"_{}\"]({})",
|
|
@@ -224,21 +226,19 @@ mod tests {
|
|
assert!(evaluated_script.contains(&expected));
|
|
assert!(evaluated_script.contains(&expected));
|
|
}
|
|
}
|
|
|
|
|
|
- fn app_version_payload() -> InvokePayload {
|
|
|
|
|
|
+ fn path_is_absolute_payload() -> InvokePayload {
|
|
let callback = CallbackFn(0);
|
|
let callback = CallbackFn(0);
|
|
let error = CallbackFn(1);
|
|
let error = CallbackFn(1);
|
|
|
|
|
|
let mut payload = serde_json::Map::new();
|
|
let mut payload = serde_json::Map::new();
|
|
- let mut msg = serde_json::Map::new();
|
|
|
|
- msg.insert(
|
|
|
|
- "cmd".into(),
|
|
|
|
- serde_json::Value::String("getAppVersion".into()),
|
|
|
|
|
|
+ payload.insert(
|
|
|
|
+ "path".into(),
|
|
|
|
+ serde_json::Value::String(std::env::current_dir().unwrap().display().to_string()),
|
|
);
|
|
);
|
|
- payload.insert("message".into(), serde_json::Value::Object(msg));
|
|
|
|
|
|
|
|
InvokePayload {
|
|
InvokePayload {
|
|
- cmd: "".into(),
|
|
|
|
- tauri_module: Some("App".into()),
|
|
|
|
|
|
+ cmd: "plugin:path|is_absolute".into(),
|
|
|
|
+ tauri_module: None,
|
|
callback,
|
|
callback,
|
|
error,
|
|
error,
|
|
inner: serde_json::Value::Object(payload),
|
|
inner: serde_json::Value::Object(payload),
|
|
@@ -262,12 +262,13 @@ mod tests {
|
|
fn scope_not_defined() {
|
|
fn scope_not_defined() {
|
|
let (_app, window) = test_context(vec![RemoteDomainAccessScope::new("app.tauri.app")
|
|
let (_app, window) = test_context(vec![RemoteDomainAccessScope::new("app.tauri.app")
|
|
.add_window("other")
|
|
.add_window("other")
|
|
|
|
+ .add_plugin("path")
|
|
.enable_tauri_api()]);
|
|
.enable_tauri_api()]);
|
|
|
|
|
|
window.navigate("https://tauri.app".parse().unwrap());
|
|
window.navigate("https://tauri.app".parse().unwrap());
|
|
- assert_ipc_response(
|
|
|
|
|
|
+ assert_ipc_response::<()>(
|
|
&window,
|
|
&window,
|
|
- app_version_payload(),
|
|
|
|
|
|
+ path_is_absolute_payload(),
|
|
Err(&crate::window::ipc_scope_not_found_error_message(
|
|
Err(&crate::window::ipc_scope_not_found_error_message(
|
|
"main",
|
|
"main",
|
|
"https://tauri.app/",
|
|
"https://tauri.app/",
|
|
@@ -279,12 +280,13 @@ mod tests {
|
|
fn scope_not_defined_for_window() {
|
|
fn scope_not_defined_for_window() {
|
|
let (_app, window) = test_context(vec![RemoteDomainAccessScope::new("tauri.app")
|
|
let (_app, window) = test_context(vec![RemoteDomainAccessScope::new("tauri.app")
|
|
.add_window("second")
|
|
.add_window("second")
|
|
|
|
+ .add_plugin("path")
|
|
.enable_tauri_api()]);
|
|
.enable_tauri_api()]);
|
|
|
|
|
|
window.navigate("https://tauri.app".parse().unwrap());
|
|
window.navigate("https://tauri.app".parse().unwrap());
|
|
- assert_ipc_response(
|
|
|
|
|
|
+ assert_ipc_response::<()>(
|
|
&window,
|
|
&window,
|
|
- app_version_payload(),
|
|
|
|
|
|
+ path_is_absolute_payload(),
|
|
Err(&crate::window::ipc_scope_window_error_message("main")),
|
|
Err(&crate::window::ipc_scope_window_error_message("main")),
|
|
);
|
|
);
|
|
}
|
|
}
|
|
@@ -293,12 +295,13 @@ mod tests {
|
|
fn scope_not_defined_for_url() {
|
|
fn scope_not_defined_for_url() {
|
|
let (_app, window) = test_context(vec![RemoteDomainAccessScope::new("github.com")
|
|
let (_app, window) = test_context(vec![RemoteDomainAccessScope::new("github.com")
|
|
.add_window("main")
|
|
.add_window("main")
|
|
|
|
+ .add_plugin("path")
|
|
.enable_tauri_api()]);
|
|
.enable_tauri_api()]);
|
|
|
|
|
|
window.navigate("https://tauri.app".parse().unwrap());
|
|
window.navigate("https://tauri.app".parse().unwrap());
|
|
- assert_ipc_response(
|
|
|
|
|
|
+ assert_ipc_response::<()>(
|
|
&window,
|
|
&window,
|
|
- app_version_payload(),
|
|
|
|
|
|
+ path_is_absolute_payload(),
|
|
Err(&crate::window::ipc_scope_domain_error_message(
|
|
Err(&crate::window::ipc_scope_domain_error_message(
|
|
"https://tauri.app/",
|
|
"https://tauri.app/",
|
|
)),
|
|
)),
|
|
@@ -307,43 +310,37 @@ mod tests {
|
|
|
|
|
|
#[test]
|
|
#[test]
|
|
fn subdomain_is_not_allowed() {
|
|
fn subdomain_is_not_allowed() {
|
|
- let (app, mut window) = test_context(vec![
|
|
|
|
|
|
+ let (_app, mut window) = test_context(vec![
|
|
RemoteDomainAccessScope::new("tauri.app")
|
|
RemoteDomainAccessScope::new("tauri.app")
|
|
.add_window("main")
|
|
.add_window("main")
|
|
|
|
+ .add_plugin("path")
|
|
.enable_tauri_api(),
|
|
.enable_tauri_api(),
|
|
RemoteDomainAccessScope::new("sub.tauri.app")
|
|
RemoteDomainAccessScope::new("sub.tauri.app")
|
|
.add_window("main")
|
|
.add_window("main")
|
|
|
|
+ .add_plugin("path")
|
|
.enable_tauri_api(),
|
|
.enable_tauri_api(),
|
|
]);
|
|
]);
|
|
|
|
|
|
window.navigate("https://tauri.app".parse().unwrap());
|
|
window.navigate("https://tauri.app".parse().unwrap());
|
|
- assert_ipc_response(
|
|
|
|
- &window,
|
|
|
|
- app_version_payload(),
|
|
|
|
- Ok(app.package_info().version.to_string().as_str()),
|
|
|
|
- );
|
|
|
|
|
|
+ assert_ipc_response(&window, path_is_absolute_payload(), Ok(true));
|
|
|
|
|
|
window.navigate("https://blog.tauri.app".parse().unwrap());
|
|
window.navigate("https://blog.tauri.app".parse().unwrap());
|
|
- assert_ipc_response(
|
|
|
|
|
|
+ assert_ipc_response::<()>(
|
|
&window,
|
|
&window,
|
|
- app_version_payload(),
|
|
|
|
|
|
+ path_is_absolute_payload(),
|
|
Err(&crate::window::ipc_scope_domain_error_message(
|
|
Err(&crate::window::ipc_scope_domain_error_message(
|
|
"https://blog.tauri.app/",
|
|
"https://blog.tauri.app/",
|
|
)),
|
|
)),
|
|
);
|
|
);
|
|
|
|
|
|
window.navigate("https://sub.tauri.app".parse().unwrap());
|
|
window.navigate("https://sub.tauri.app".parse().unwrap());
|
|
- assert_ipc_response(
|
|
|
|
- &window,
|
|
|
|
- app_version_payload(),
|
|
|
|
- Ok(app.package_info().version.to_string().as_str()),
|
|
|
|
- );
|
|
|
|
|
|
+ assert_ipc_response(&window, path_is_absolute_payload(), Ok(true));
|
|
|
|
|
|
window.window.label = "test".into();
|
|
window.window.label = "test".into();
|
|
window.navigate("https://dev.tauri.app".parse().unwrap());
|
|
window.navigate("https://dev.tauri.app".parse().unwrap());
|
|
- assert_ipc_response(
|
|
|
|
|
|
+ assert_ipc_response::<()>(
|
|
&window,
|
|
&window,
|
|
- app_version_payload(),
|
|
|
|
|
|
+ path_is_absolute_payload(),
|
|
Err(&crate::window::ipc_scope_not_found_error_message(
|
|
Err(&crate::window::ipc_scope_not_found_error_message(
|
|
"test",
|
|
"test",
|
|
"https://dev.tauri.app/",
|
|
"https://dev.tauri.app/",
|
|
@@ -353,16 +350,13 @@ mod tests {
|
|
|
|
|
|
#[test]
|
|
#[test]
|
|
fn subpath_is_allowed() {
|
|
fn subpath_is_allowed() {
|
|
- let (app, window) = test_context(vec![RemoteDomainAccessScope::new("tauri.app")
|
|
|
|
|
|
+ let (_app, window) = test_context(vec![RemoteDomainAccessScope::new("tauri.app")
|
|
.add_window("main")
|
|
.add_window("main")
|
|
|
|
+ .add_plugin("path")
|
|
.enable_tauri_api()]);
|
|
.enable_tauri_api()]);
|
|
|
|
|
|
window.navigate("https://tauri.app/inner/path".parse().unwrap());
|
|
window.navigate("https://tauri.app/inner/path".parse().unwrap());
|
|
- assert_ipc_response(
|
|
|
|
- &window,
|
|
|
|
- app_version_payload(),
|
|
|
|
- Ok(app.package_info().version.to_string().as_str()),
|
|
|
|
- );
|
|
|
|
|
|
+ assert_ipc_response(&window, path_is_absolute_payload(), Ok(true));
|
|
}
|
|
}
|
|
|
|
|
|
#[test]
|
|
#[test]
|
|
@@ -372,9 +366,9 @@ mod tests {
|
|
]);
|
|
]);
|
|
|
|
|
|
window.navigate("https://tauri.app".parse().unwrap());
|
|
window.navigate("https://tauri.app".parse().unwrap());
|
|
- assert_ipc_response(
|
|
|
|
|
|
+ assert_ipc_response::<()>(
|
|
&window,
|
|
&window,
|
|
- app_version_payload(),
|
|
|
|
|
|
+ path_is_absolute_payload(),
|
|
Err(crate::window::IPC_SCOPE_DOES_NOT_ALLOW),
|
|
Err(crate::window::IPC_SCOPE_DOES_NOT_ALLOW),
|
|
);
|
|
);
|
|
}
|
|
}
|
|
@@ -386,7 +380,7 @@ mod tests {
|
|
.add_plugin(PLUGIN_NAME)]);
|
|
.add_plugin(PLUGIN_NAME)]);
|
|
|
|
|
|
window.navigate("https://tauri.app".parse().unwrap());
|
|
window.navigate("https://tauri.app".parse().unwrap());
|
|
- assert_ipc_response(
|
|
|
|
|
|
+ assert_ipc_response::<()>(
|
|
&window,
|
|
&window,
|
|
plugin_test_payload(),
|
|
plugin_test_payload(),
|
|
Err(&format!("plugin {PLUGIN_NAME} not found")),
|
|
Err(&format!("plugin {PLUGIN_NAME} not found")),
|
|
@@ -400,7 +394,7 @@ mod tests {
|
|
]);
|
|
]);
|
|
|
|
|
|
window.navigate("https://tauri.app".parse().unwrap());
|
|
window.navigate("https://tauri.app".parse().unwrap());
|
|
- assert_ipc_response(
|
|
|
|
|
|
+ assert_ipc_response::<()>(
|
|
&window,
|
|
&window,
|
|
plugin_test_payload(),
|
|
plugin_test_payload(),
|
|
Err(crate::window::IPC_SCOPE_DOES_NOT_ALLOW),
|
|
Err(crate::window::IPC_SCOPE_DOES_NOT_ALLOW),
|