feat(前端界面): OFDGo WebUI优化系统字体权限请求

This commit is contained in:
2026-07-07 15:14:25 +08:00
parent 654bedbd33
commit ebfe7b5d17
3 changed files with 50 additions and 3 deletions
+1
View File
@@ -101,6 +101,7 @@
<button id="fontAddButton" class="small-button" type="button">添加</button> <button id="fontAddButton" class="small-button" type="button">添加</button>
</div> </div>
</div> </div>
<div id="fontPermissionHint" class="font-permission-hint" hidden>需授权读取系统字体</div>
<div id="fontList" class="font-list"></div> <div id="fontList" class="font-list"></div>
</section> </section>
</aside> </aside>
+10
View File
@@ -652,6 +652,16 @@ body[data-hide-meta] .meta-panel {
gap: 8px; gap: 8px;
} }
.font-permission-hint {
margin: 0 0 8px;
padding: 7px 8px;
border: 1px solid var(--line);
background: #ffffff;
color: var(--text-muted);
font-size: 12px;
line-height: 1.35;
}
.font-row { .font-row {
display: grid; display: grid;
grid-template-columns: minmax(0, 1fr) auto; grid-template-columns: minmax(0, 1fr) auto;
+36
View File
@@ -53,6 +53,7 @@ const state = {
localFonts: [], localFonts: [],
userFonts: [], userFonts: [],
systemFontCatalog: [], systemFontCatalog: [],
systemFontPermission: "prompt",
doc: null, doc: null,
pageIndex: 0, pageIndex: 0,
scale: 1, scale: 1,
@@ -108,6 +109,7 @@ const el = {
docFontList: document.querySelector("#docFontList"), docFontList: document.querySelector("#docFontList"),
docFontSummary: document.querySelector("#docFontSummary"), docFontSummary: document.querySelector("#docFontSummary"),
availableFontSummary: document.querySelector("#availableFontSummary"), availableFontSummary: document.querySelector("#availableFontSummary"),
fontPermissionHint: document.querySelector("#fontPermissionHint"),
fontList: document.querySelector("#fontList"), fontList: document.querySelector("#fontList"),
statusText: document.querySelector("#statusText"), statusText: document.querySelector("#statusText"),
}; };
@@ -194,6 +196,7 @@ async function boot() {
renderFontList(); renderFontList();
updateControls(); updateControls();
updateLocalFontButton(); updateLocalFontButton();
await refreshLocalFontPermission();
setStatus(STATUS.ready); setStatus(STATUS.ready);
setBusy(false); setBusy(false);
} catch (err) { } catch (err) {
@@ -395,9 +398,19 @@ async function loadLocalFonts() {
} }
async function queryLocalFonts() { async function queryLocalFonts() {
try {
const available = await window.queryLocalFonts(); const available = await window.queryLocalFonts();
state.systemFontCatalog = available; state.systemFontCatalog = available;
state.systemFontPermission = "granted";
updateFontPermissionHint();
return available; return available;
} catch (err) {
if (err && err.name === "NotAllowedError") {
state.systemFontPermission = "denied";
updateFontPermissionHint();
}
throw err;
}
} }
async function autoLoadDocumentLocalFonts(openSeq) { async function autoLoadDocumentLocalFonts(openSeq) {
@@ -765,12 +778,35 @@ function updateLocalFontButton() {
const supported = canReadLocalFonts(); const supported = canReadLocalFonts();
el.localFontButton.disabled = !supported; el.localFontButton.disabled = !supported;
el.localFontButton.title = supported ? "授权读取浏览器可访问的系统字体" : "当前浏览器不支持读取系统字体"; el.localFontButton.title = supported ? "授权读取浏览器可访问的系统字体" : "当前浏览器不支持读取系统字体";
updateFontPermissionHint();
}
function updateFontPermissionHint() {
el.fontPermissionHint.hidden = !canReadLocalFonts() || state.systemFontPermission === "granted";
} }
function canReadLocalFonts() { function canReadLocalFonts() {
return typeof window.queryLocalFonts === "function"; return typeof window.queryLocalFonts === "function";
} }
async function refreshLocalFontPermission() {
if (!canReadLocalFonts() || !navigator.permissions?.query) {
updateFontPermissionHint();
return;
}
try {
const permission = await navigator.permissions.query({ name: "local-fonts" });
state.systemFontPermission = permission.state;
permission.onchange = () => {
state.systemFontPermission = permission.state;
updateFontPermissionHint();
};
} catch {
state.systemFontPermission = "prompt";
}
updateFontPermissionHint();
}
async function openDocument(options = {}) { async function openDocument(options = {}) {
if (!state.ofdBytes) { if (!state.ofdBytes) {
return; return;