feat: 将发布预检移入内置浏览器
This commit is contained in:
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user