From 80b13dacba7467a4b5110adf370d5f99867f5731 Mon Sep 17 00:00:00 2001
From: wylovely <2016688030@qq.com>
Date: Thu, 24 Sep 2026 15:27:12 +0800
Subject: [PATCH] fix(#787): derive Viewer title from data-original-url so
image preview shows the filename (was empty for
)
---
.../cn/keking/PictureFilePreviewTests.java | 46 +++++++++++++++++++
1 file changed, 46 insertions(+)
create mode 100644 server/src/test/java/cn/keking/PictureFilePreviewTests.java
diff --git a/server/src/test/java/cn/keking/PictureFilePreviewTests.java b/server/src/test/java/cn/keking/PictureFilePreviewTests.java
new file mode 100644
index 00000000..9885b634
--- /dev/null
+++ b/server/src/test/java/cn/keking/PictureFilePreviewTests.java
@@ -0,0 +1,46 @@
+package cn.keking;
+
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * kkFileView #787 回归测试:直接图片预览(picture.ftl)必须在 Viewer.js 标题里显示文件名。
+ *
+ * 根因:v4.3.0 之后模板把图片元素从 <img> 改成 <div src>,而 HTMLDivElement 没有 DOM 的
+ * src 属性,Viewer.js 用 image.src 取标题得到 undefined,导致标题为空。修复方式是在 Viewer 初始化时
+ * 配置 title 函数,从 data-original-url 派生文件名(该属性在元素克隆时会被保留)。
+ */
+public class PictureFilePreviewTests {
+
+ @Test
+ void shouldDeriveViewerTitleFromOriginalUrl() throws IOException {
+ String pictureTemplate = readResource("/web/picture.ftl");
+
+ // 模板仍保留 data-original-url 供标题派生使用
+ assertTrue(pictureTemplate.contains("data-original-url"),
+ () -> "picture.ftl must keep data-original-url for title derivation (see #787)");
+
+ // Viewer 初始化必须配置 title 函数,否则
的 image.src 为 undefined、标题为空
+ assertTrue(pictureTemplate.contains("title: function"),
+ () -> "picture.ftl must configure a Viewer title function to show the filename (see #787)");
+
+ // 标题派生逻辑必须读取 data-original-url(而非反代 / CORS 代理 URL)
+ assertTrue(pictureTemplate.contains("getImageNameFromOriginalUrl"),
+ () -> "picture.ftl must derive the title from data-original-url (see #787)");
+ assertTrue(pictureTemplate.contains("getAttribute('data-original-url')"),
+ () -> "title derivation must read data-original-url attribute (see #787)");
+ }
+
+ private String readResource(String resourcePath) throws IOException {
+ try (InputStream inputStream = getClass().getResourceAsStream(resourcePath)) {
+ assertNotNull(inputStream);
+ return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
+ }
+ }
+}