feat: 将发布预检移入内置浏览器

This commit is contained in:
2026-08-12 16:33:50 +08:00
parent be9bc84474
commit 926056a59b
16 changed files with 840 additions and 9 deletions

View File

@@ -40,6 +40,7 @@ const electronMocks = vi.hoisted(() => {
setPermissionCheckHandler: permissionCheckHandler,
clearStorageData: vi.fn().mockResolvedValue(undefined),
clearCache: vi.fn().mockResolvedValue(undefined),
webRequest: { onBeforeRequest: vi.fn() },
});
class MockWebContentsView {
@@ -64,6 +65,7 @@ const electronMocks = vi.hoisted(() => {
isDestroyed: vi.fn().mockReturnValue(false),
isDevToolsOpened: vi.fn().mockReturnValue(false),
reload: vi.fn(),
executeJavaScript: vi.fn().mockResolvedValue({ ok: true }),
close: vi.fn(),
setWindowOpenHandler: vi.fn(),
});
@@ -100,7 +102,7 @@ describe('ElectronAgentBrowserAdapter', () => {
electronMocks.browserSession.removeAllListeners();
});
it('creates an isolated sandboxed WebContentsView and mounts it in Main', () => {
it('creates an isolated sandboxed WebContentsView and mounts it in Main', async () => {
const addChildView = vi.fn();
const removeChildView = vi.fn();
const mainWindow = {
@@ -139,6 +141,7 @@ describe('ElectronAgentBrowserAdapter', () => {
view.setBounds({ x: 100, y: 80, width: 800, height: 600 });
view.setVisible(true);
view.webContents.navigationHistory.clear();
await expect(view.webContents.executeJavaScript('document.readyState')).resolves.toEqual({ ok: true });
expect(electronMocks.nativeViews[0].setBounds).toHaveBeenCalledWith({
x: 125,
y: 100,
@@ -208,4 +211,34 @@ describe('ElectronAgentBrowserAdapter', () => {
expect(customRedirect.preventDefault).toHaveBeenCalledOnce();
expect(webNavigation.preventDefault).not.toHaveBeenCalled();
});
it('cancels cross-origin web requests before they leave a temporary partition', () => {
const adapter = new ElectronAgentBrowserAdapter({
isDestroyed: vi.fn().mockReturnValue(false),
contentView: { addChildView: vi.fn(), removeChildView: vi.fn() },
webContents: { getZoomFactor: vi.fn().mockReturnValue(1) },
getContentBounds: vi.fn().mockReturnValue({ x: 0, y: 0, width: 1024, height: 768 }),
} as never);
const release = adapter.restrictPartitionToOrigin(
'niancode-publish-preflight:test',
'http://127.0.0.1:4173',
);
const listener = electronMocks.browserSession.webRequest.onBeforeRequest.mock.calls[0]?.[1];
const sameOrigin = vi.fn();
const external = vi.fn();
const websocket = vi.fn();
const secureWebsocket = vi.fn();
listener({ url: 'http://127.0.0.1:4173/app.js' }, sameOrigin);
listener({ url: 'https://evil.example/track' }, external);
listener({ url: 'ws://127.0.0.1:4173/socket' }, websocket);
listener({ url: 'wss://127.0.0.1:4173/socket' }, secureWebsocket);
release();
expect(sameOrigin).toHaveBeenCalledWith({ cancel: false });
expect(external).toHaveBeenCalledWith({ cancel: true });
expect(websocket).toHaveBeenCalledWith({ cancel: true });
expect(secureWebsocket).toHaveBeenCalledWith({ cancel: true });
expect(electronMocks.browserSession.webRequest.onBeforeRequest).toHaveBeenLastCalledWith(null);
});
});