feat: 收口 Rust Web 3000 主链

This commit is contained in:
lix-2026
2026-05-11 13:16:34 +08:00
parent 7f3f7d4e2f
commit 17c003976b
61 changed files with 2090 additions and 2256 deletions
+76 -12
View File
@@ -4,7 +4,7 @@ const BASE_URL = (process.env.MNOTE_UI_BASE_URL || "http://127.0.0.1:3000").repl
const DOCUMENT_UI_BASE_URL = (
process.env.MNOTE_TREE_SMOKE_DOCUMENT_BASE_URL ||
process.env.MNOTE_LEGACY_UI_BASE_URL ||
"http://127.0.0.1:3100"
BASE_URL
).replace(/\/+$/, "");
const MNOTE_WEB_BASE_URL = (process.env.MNOTE_WEB_SMOKE_BASE_URL || "").replace(/\/+$/, "");
const REQUEST_TIMEOUT_MS = Number(process.env.MNOTE_SMOKE_TIMEOUT_MS || 20_000);
@@ -109,6 +109,7 @@ async function renameDocument(requestContext, workspaceId, documentId, title) {
workspaceId,
documentId,
title,
commandName: "page.head.updateTitle",
},
});
}
@@ -339,9 +340,26 @@ async function cleanupDocuments(requestContext, createdIds) {
async function openDocument(page, workspaceId, documentId) {
const url = `${DOCUMENT_UI_BASE_URL}/documents/${documentId}?workspaceId=${encodeURIComponent(workspaceId)}`;
const hasSidebarControls = async () => {
const pageTab = page.locator('[data-mnote-sidebar-tree-tab="page"]').first();
const filetreeTab = page.locator('[data-mnote-sidebar-tree-tab="filetree"]').first();
const groupButton = page.getByRole("button", { name: "分组" });
const fileButton = page.getByRole("button", { name: "文件" });
return (await isVisible(groupButton)) || (await isVisible(fileButton));
if ((await isVisible(pageTab)) || (await isVisible(filetreeTab))) {
return true;
}
if ((await isVisible(groupButton)) || (await isVisible(fileButton))) {
return true;
}
return await page.evaluate(() => {
const pageShell = document.querySelector('[data-testid="wolai-sidebar-page-tree-shell"]');
const legacyShell = document.querySelector('[data-testid="sidebar-page-tree-shell"]');
return [pageShell, legacyShell].some((node) => {
if (!(node instanceof HTMLElement)) return false;
const style = window.getComputedStyle(node);
const rect = node.getBoundingClientRect();
return !node.hidden && style.display !== "none" && style.visibility !== "hidden" && rect.width > 0 && rect.height > 0;
});
});
};
const gotoDocument = async () => {
@@ -379,13 +397,20 @@ async function openDocument(page, workspaceId, documentId) {
}
async function openSectionView(page) {
const button = page.getByRole("button", { name: "分组" });
await button.waitFor({ state: "visible", timeout: UI_TIMEOUT_MS });
const waitForHost = () =>
page.waitForFunction(
() => {
const pageHost = document.querySelector('[data-testid="sidebar-page-tree-shell"]');
return pageHost instanceof HTMLElement && pageHost.getClientRects().length > 0;
const pagePanel = document.querySelector('[data-mnote-sidebar-tree-panel="page"]');
const pageRoot = document.getElementById("sidebar-tree-root");
const legacyHost = document.querySelector('[data-testid="sidebar-page-tree-shell"]');
const isVisible = (node) =>
node instanceof HTMLElement &&
!node.hidden &&
window.getComputedStyle(node).display !== "none" &&
window.getComputedStyle(node).visibility !== "hidden" &&
node.getClientRects().length > 0;
if (isVisible(legacyHost)) return true;
return isVisible(pageRoot) && (!pagePanel || isVisible(pagePanel));
},
undefined,
{ timeout: UI_TIMEOUT_MS },
@@ -399,7 +424,23 @@ async function openSectionView(page) {
}
for (let attempt = 0; attempt < 2; attempt += 1) {
await clickButtonByExactText(page, "分组");
const switched = await page.evaluate(() => {
const selectors = [
'[data-mnote-sidebar-tree-tab="page"]',
'button[aria-label="分组"]',
];
for (const selector of selectors) {
const node = document.querySelector(selector);
if (node instanceof HTMLElement) {
node.click();
return true;
}
}
return false;
});
if (!switched) {
throw new Error("未找到页面树切换入口");
}
try {
await waitForHost();
return;
@@ -412,13 +453,20 @@ async function openSectionView(page) {
}
async function openFilesystemView(page) {
const button = page.getByRole("button", { name: "文件" });
await button.waitFor({ state: "visible", timeout: UI_TIMEOUT_MS });
const waitForHost = () =>
page.waitForFunction(
() => {
const fileHost = document.querySelector('[data-testid="sidebar-file-tree-shell"]');
return fileHost instanceof HTMLElement && fileHost.getClientRects().length > 0;
const filePanel = document.querySelector('[data-mnote-sidebar-tree-panel="filetree"]');
const fileRoot = document.getElementById("sidebar-file-tree-root");
const legacyHost = document.querySelector('[data-testid="sidebar-file-tree-shell"]');
const isVisible = (node) =>
node instanceof HTMLElement &&
!node.hidden &&
window.getComputedStyle(node).display !== "none" &&
window.getComputedStyle(node).visibility !== "hidden" &&
node.getClientRects().length > 0;
if (isVisible(legacyHost)) return true;
return isVisible(fileRoot) && (!filePanel || isVisible(filePanel));
},
undefined,
{ timeout: UI_TIMEOUT_MS },
@@ -432,7 +480,23 @@ async function openFilesystemView(page) {
}
for (let attempt = 0; attempt < 2; attempt += 1) {
await clickButtonByExactText(page, "文件");
const switched = await page.evaluate(() => {
const selectors = [
'[data-mnote-sidebar-tree-tab="filetree"]',
'button[aria-label="文件"]',
];
for (const selector of selectors) {
const node = document.querySelector(selector);
if (node instanceof HTMLElement) {
node.click();
return true;
}
}
return false;
});
if (!switched) {
throw new Error("未找到文件树切换入口");
}
try {
await waitForHost();
return;