返回 DeepSeek-Reasonix
guestView.ts
根目录 / desktop / electron / src / main / browser / guestView.ts
1 import type { KeyboardInputEvent, MouseInputEvent, MouseWheelInputEvent, Rectangle, WebPreferences } from "electron";
2 import type { DiagnosticBuffer } from "./diagnostics.js";
3 import type { BrowserViewport } from "./viewport.js";
4
5 // The slice of Electron the browser modules touch. Production binds the real
6 // WebContentsView (see electronGuestViews.ts); tests inject fakes.
7
8 export interface GuestFrame {
9 readonly frameTreeNodeId: number;
10 readonly url: string;
11 readonly detached: boolean;
12 readonly parent: GuestFrame | null;
13 readonly framesInSubtree: GuestFrame[];
14 readonly frames?: GuestFrame[];
15 readonly name?: string;
16 executeJavaScript(code: string, userGesture?: boolean): Promise<unknown>;
17 }
18
19 export interface GuestDebugger {
20 isAttached(): boolean;
21 attach(protocolVersion?: string): void;
22 detach(): void;
23 sendCommand(method: string, params?: unknown, sessionId?: string): Promise<unknown>;
24 on(event: "message", listener: (event: unknown, method: string, params: unknown) => void): unknown;
25 removeListener(event: "message", listener: (event: unknown, method: string, params: unknown) => void): unknown;
26 }
27
28 export interface GuestImage {
29 toPNG(): Buffer;
30 getSize(): { width: number; height: number };
31 }
32
33 export interface GuestPage {
34 readonly id: number;
35 readonly mainFrame: GuestFrame;
36 readonly debugger: GuestDebugger;
37 readonly navigationHistory: { canGoBack(): boolean; canGoForward(): boolean; goBack(): void; goForward(): void };
38 isDestroyed(): boolean;
39 loadURL(url: string): Promise<void>;
40 getURL(): string;
41 getTitle(): string;
42 isLoading(): boolean;
43 reload(): void;
44 stop(): void;
45 getZoomFactor(): number;
46 setZoomFactor(factor: number): void;
47 isDevToolsOpened(): boolean;
48 openDevTools(options?: { mode: "detach" }): void;
49 closeDevTools(): void;
50 focus(): void;
51 executeJavaScriptInIsolatedWorld(worldId: number, scripts: { code: string }[], userGesture?: boolean): Promise<unknown>;
52 sendInputEvent(event: MouseInputEvent | MouseWheelInputEvent | KeyboardInputEvent): void;
53 insertText(text: string): Promise<void>;
54 capturePage(rect?: Rectangle): Promise<GuestImage>;
55 }
56
57 export interface GuestViewEvents {
58 onStartLoading(): void;
59 onStopLoading(): void;
60 onNavigate(url: string, inPage: boolean): void;
61 onTitle(title: string): void;
62 onFailLoad(code: number, description: string, url: string): void;
63 onRenderProcessGone(reason: string): void;
64 onDestroyed(): void;
65 // Popups (window.open, target=_blank) become tabs of the same task and
66 // partition; adopt() receives the view Electron created for the child.
67 onPopup(url: string, disposition: string): ((view: GuestView) => void) | null;
68 }
69
70 export interface GuestView {
71 readonly page: GuestPage;
72 prepareCapture?(signal: AbortSignal, recording?: boolean): Promise<() => void>;
73 presentForUser?(): void;
74 captureSurfaceSize?(): { width: number; height: number };
75 prepareObservation?(): () => void;
76 sendMouseInput?(event: MouseInputEvent, verify?: () => void): Promise<void>;
77 diagnostics?: DiagnosticBuffer;
78 setViewport?(viewport: BrowserViewport | null): void;
79 inputScale?(): number;
80 capturePixelRatio?(): number;
81 ensureLoaded?(): Promise<void>;
82 isPlaceholder?(): boolean;
83 bind(events: GuestViewEvents): void;
84 setBounds(bounds: Rectangle): void;
85 setVisible(visible: boolean): void;
86 destroy(): void;
87 }
88
89 export interface GuestViewFactory {
90 create(partition: string, inherited?: WebPreferences): GuestView;
91 }
92
93 export const BLOCKED_NAVIGATION_SCHEMES = new Set(["file:", "reasonix:", "javascript:", "data:", "blob:"]);
94
95 export function isBlockedNavigation(url: string): boolean {
96 try {
97 return BLOCKED_NAVIGATION_SCHEMES.has(new URL(url).protocol);
98 } catch {
99 return true;
100 }
101 }
102
103 export function isPopupURL(url: string): boolean {
104 if (url === "about:blank" || url === "") return true;
105 try {
106 const protocol = new URL(url).protocol;
107 return protocol === "http:" || protocol === "https:";
108 } catch {
109 return false;
110 }
111 }
112
112 lines TYPESCRIPT