@@ -66,7 +66,9 @@ use ui::{
StickyCandidate, Tooltip, WithScrollbar, prelude::*, v_flex,
};
use util::{
- ResultExt, TakeUntilExt, TryFutureExt, maybe,
+ ResultExt, TakeUntilExt, TryFutureExt,
+ markdown::MarkdownInlineCode,
+ maybe,
paths::{PathStyle, compare_paths},
rel_path::{RelPath, RelPathBuf},
};
@@ -2357,7 +2359,10 @@ impl ProjectPanel {
""
};
- format!("{message_start} {path}?{unsaved_warning}")
+ format!(
+ "{message_start} {}?{unsaved_warning}",
+ MarkdownInlineCode(path)
+ )
}
_ => {
const CUTOFF_POINT: usize = 10;
@@ -2365,7 +2370,7 @@ impl ProjectPanel {
let truncated_path_counts = file_paths.len() - CUTOFF_POINT;
let mut paths = file_paths
.iter()
- .map(|(_, _, path)| path.clone())
+ .map(|(_, _, path)| MarkdownInlineCode(path).to_string())
.take(CUTOFF_POINT)
.collect::<Vec<_>>();
paths.truncate(CUTOFF_POINT);
@@ -2376,7 +2381,10 @@ impl ProjectPanel {
}
paths
} else {
- file_paths.iter().map(|(_, _, path)| path.clone()).collect()
+ file_paths
+ .iter()
+ .map(|(_, _, path)| MarkdownInlineCode(path).to_string())
+ .collect()
};
let unsaved_warning = if dirty_buffers == 0 {
String::new()
@@ -10339,3 +10339,39 @@ impl Render for TestProjectItemView {
Empty
}
}
+
+#[gpui::test]
+async fn test_delete_prompt_escapes_markdown_in_file_name(cx: &mut gpui::TestAppContext) {
+ init_test(cx);
+
+ let fs = FakeFs::new(cx.executor());
+ fs.insert_tree(
+ "/root",
+ json!({
+ "__somefile__": "",
+ }),
+ )
+ .await;
+
+ let project = Project::test(fs.clone(), ["/root".as_ref()], cx).await;
+ let window = cx.add_window(|window, cx| MultiWorkspace::test_new(project.clone(), window, cx));
+ let workspace = window
+ .read_with(cx, |mw, _| mw.workspace().clone())
+ .unwrap();
+ let cx = &mut VisualTestContext::from_window(window.into(), cx);
+ let panel = workspace.update_in(cx, ProjectPanel::new);
+ cx.run_until_parked();
+
+ select_path(&panel, "root/__somefile__", cx);
+ panel.update_in(cx, |panel, window, cx| {
+ panel.delete(&Delete { skip_prompt: false }, window, cx)
+ });
+ let (message, _detail) = cx
+ .pending_prompt()
+ .expect("delete should show a confirmation prompt");
+
+ assert_eq!(
+ message,
+ "Are you sure you want to permanently delete `__somefile__`?"
+ );
+}