browser-use 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +295 -686
- package/dist/actor/element.d.ts +19 -0
- package/dist/actor/element.js +46 -0
- package/dist/actor/index.d.ts +4 -0
- package/dist/actor/index.js +4 -0
- package/dist/actor/mouse.d.ts +19 -0
- package/dist/actor/mouse.js +39 -0
- package/dist/actor/page.d.ts +29 -0
- package/dist/actor/page.js +88 -0
- package/dist/actor/utils.d.ts +4 -0
- package/dist/actor/utils.js +35 -0
- package/dist/agent/cloud-events.d.ts +18 -0
- package/dist/agent/cloud-events.js +65 -2
- package/dist/agent/gif.d.ts +1 -0
- package/dist/agent/gif.js +24 -2
- package/dist/agent/judge.d.ts +17 -0
- package/dist/agent/judge.js +197 -0
- package/dist/agent/message-manager/service.d.ts +12 -4
- package/dist/agent/message-manager/service.js +205 -39
- package/dist/agent/message-manager/utils.js +0 -1
- package/dist/agent/message-manager/views.d.ts +4 -0
- package/dist/agent/message-manager/views.js +11 -7
- package/dist/agent/prompts.d.ts +24 -3
- package/dist/agent/prompts.js +274 -59
- package/dist/agent/service.d.ts +103 -41
- package/dist/agent/service.js +2336 -472
- package/dist/agent/variable-detector.d.ts +12 -0
- package/dist/agent/variable-detector.js +211 -0
- package/dist/agent/views.d.ts +237 -18
- package/dist/agent/views.js +446 -33
- package/dist/browser/cloud/cloud.d.ts +20 -0
- package/dist/browser/cloud/cloud.js +129 -0
- package/dist/browser/cloud/index.d.ts +2 -0
- package/dist/browser/cloud/index.js +2 -0
- package/dist/browser/cloud/views.d.ts +41 -0
- package/dist/browser/cloud/views.js +35 -0
- package/dist/browser/events.d.ts +345 -0
- package/dist/browser/events.js +566 -0
- package/dist/browser/extensions.js +17 -17
- package/dist/browser/index.d.ts +4 -0
- package/dist/browser/index.js +4 -0
- package/dist/browser/profile.d.ts +10 -4
- package/dist/browser/profile.js +79 -12
- package/dist/browser/session-manager.d.ts +85 -0
- package/dist/browser/session-manager.js +208 -0
- package/dist/browser/session.d.ts +105 -9
- package/dist/browser/session.js +1166 -95
- package/dist/browser/types.d.ts +153 -156
- package/dist/browser/views.d.ts +39 -0
- package/dist/browser/views.js +32 -0
- package/dist/browser/watchdogs/aboutblank-watchdog.d.ts +12 -0
- package/dist/browser/watchdogs/aboutblank-watchdog.js +131 -0
- package/dist/browser/watchdogs/base.d.ts +21 -0
- package/dist/browser/watchdogs/base.js +81 -0
- package/dist/browser/watchdogs/cdp-session-watchdog.d.ts +14 -0
- package/dist/browser/watchdogs/cdp-session-watchdog.js +177 -0
- package/dist/browser/watchdogs/crash-watchdog.d.ts +38 -0
- package/dist/browser/watchdogs/crash-watchdog.js +296 -0
- package/dist/browser/watchdogs/default-action-watchdog.d.ts +49 -0
- package/dist/browser/watchdogs/default-action-watchdog.js +212 -0
- package/dist/browser/watchdogs/dom-watchdog.d.ts +8 -0
- package/dist/browser/watchdogs/dom-watchdog.js +31 -0
- package/dist/browser/watchdogs/downloads-watchdog.d.ts +77 -0
- package/dist/browser/watchdogs/downloads-watchdog.js +409 -0
- package/dist/browser/watchdogs/har-recording-watchdog.d.ts +19 -0
- package/dist/browser/watchdogs/har-recording-watchdog.js +317 -0
- package/dist/browser/watchdogs/index.d.ts +15 -0
- package/dist/browser/watchdogs/index.js +15 -0
- package/dist/browser/watchdogs/local-browser-watchdog.d.ts +10 -0
- package/dist/browser/watchdogs/local-browser-watchdog.js +32 -0
- package/dist/browser/watchdogs/permissions-watchdog.d.ts +8 -0
- package/dist/browser/watchdogs/permissions-watchdog.js +73 -0
- package/dist/browser/watchdogs/popups-watchdog.d.ts +13 -0
- package/dist/browser/watchdogs/popups-watchdog.js +77 -0
- package/dist/browser/watchdogs/recording-watchdog.d.ts +27 -0
- package/dist/browser/watchdogs/recording-watchdog.js +249 -0
- package/dist/browser/watchdogs/screenshot-watchdog.d.ts +6 -0
- package/dist/browser/watchdogs/screenshot-watchdog.js +13 -0
- package/dist/browser/watchdogs/security-watchdog.d.ts +10 -0
- package/dist/browser/watchdogs/security-watchdog.js +84 -0
- package/dist/browser/watchdogs/storage-state-watchdog.d.ts +24 -0
- package/dist/browser/watchdogs/storage-state-watchdog.js +288 -0
- package/dist/cli.d.ts +7 -2
- package/dist/cli.js +182 -25
- package/dist/code-use/formatting.d.ts +3 -0
- package/dist/code-use/formatting.js +18 -0
- package/dist/code-use/index.d.ts +6 -0
- package/dist/code-use/index.js +6 -0
- package/dist/code-use/namespace.d.ts +5 -0
- package/dist/code-use/namespace.js +81 -0
- package/dist/code-use/notebook-export.d.ts +3 -0
- package/dist/code-use/notebook-export.js +56 -0
- package/dist/code-use/service.d.ts +24 -0
- package/dist/code-use/service.js +104 -0
- package/dist/code-use/utils.d.ts +4 -0
- package/dist/code-use/utils.js +98 -0
- package/dist/code-use/views.d.ts +108 -0
- package/dist/code-use/views.js +165 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.js +109 -7
- package/dist/controller/registry/service.d.ts +10 -1
- package/dist/controller/registry/service.js +266 -10
- package/dist/controller/registry/views.d.ts +4 -1
- package/dist/controller/registry/views.js +25 -2
- package/dist/controller/service.d.ts +10 -1
- package/dist/controller/service.js +1814 -268
- package/dist/controller/views.d.ts +78 -155
- package/dist/controller/views.js +61 -12
- package/dist/dom/history-tree-processor/service.d.ts +5 -0
- package/dist/dom/history-tree-processor/service.js +169 -14
- package/dist/dom/history-tree-processor/view.d.ts +7 -1
- package/dist/dom/history-tree-processor/view.js +10 -1
- package/dist/dom/markdown-extractor.d.ts +37 -0
- package/dist/dom/markdown-extractor.js +345 -0
- package/dist/dom/service.d.ts +3 -1
- package/dist/dom/service.js +76 -0
- package/dist/dom/views.d.ts +1 -0
- package/dist/dom/views.js +45 -0
- package/dist/event-bus.d.ts +107 -7
- package/dist/event-bus.js +313 -10
- package/dist/exceptions.d.ts +0 -3
- package/dist/exceptions.js +0 -7
- package/dist/filesystem/file-system.d.ts +18 -0
- package/dist/filesystem/file-system.js +503 -42
- package/dist/index.d.ts +7 -0
- package/dist/index.js +6 -0
- package/dist/integrations/gmail/actions.d.ts +3 -3
- package/dist/integrations/gmail/actions.js +4 -4
- package/dist/llm/anthropic/chat.d.ts +18 -1
- package/dist/llm/anthropic/chat.js +123 -55
- package/dist/llm/anthropic/serializer.d.ts +2 -0
- package/dist/llm/anthropic/serializer.js +81 -9
- package/dist/llm/aws/chat-anthropic.d.ts +17 -0
- package/dist/llm/aws/chat-anthropic.js +126 -26
- package/dist/llm/aws/chat-bedrock.d.ts +28 -1
- package/dist/llm/aws/chat-bedrock.js +161 -34
- package/dist/llm/aws/serializer.d.ts +13 -1
- package/dist/llm/aws/serializer.js +56 -17
- package/dist/llm/azure/chat.d.ts +53 -2
- package/dist/llm/azure/chat.js +366 -54
- package/dist/llm/base.d.ts +2 -0
- package/dist/llm/browser-use/chat.d.ts +40 -0
- package/dist/llm/browser-use/chat.js +305 -0
- package/dist/llm/browser-use/index.d.ts +1 -0
- package/dist/llm/browser-use/index.js +1 -0
- package/dist/llm/cerebras/chat.d.ts +39 -0
- package/dist/llm/cerebras/chat.js +178 -0
- package/dist/llm/cerebras/index.d.ts +2 -0
- package/dist/llm/cerebras/index.js +2 -0
- package/dist/llm/cerebras/serializer.d.ts +7 -0
- package/dist/llm/cerebras/serializer.js +82 -0
- package/dist/llm/deepseek/chat.d.ts +19 -2
- package/dist/llm/deepseek/chat.js +138 -25
- package/dist/llm/google/chat.d.ts +46 -2
- package/dist/llm/google/chat.js +267 -64
- package/dist/llm/google/serializer.d.ts +9 -1
- package/dist/llm/google/serializer.js +141 -34
- package/dist/llm/groq/chat.d.ts +21 -2
- package/dist/llm/groq/chat.js +125 -26
- package/dist/llm/groq/parser.js +3 -1
- package/dist/llm/mistral/chat.d.ts +43 -0
- package/dist/llm/mistral/chat.js +154 -0
- package/dist/llm/mistral/index.d.ts +2 -0
- package/dist/llm/mistral/index.js +2 -0
- package/dist/llm/mistral/schema.d.ts +8 -0
- package/dist/llm/mistral/schema.js +27 -0
- package/dist/llm/models.d.ts +2 -0
- package/dist/llm/models.js +317 -0
- package/dist/llm/ollama/chat.d.ts +13 -1
- package/dist/llm/ollama/chat.js +110 -19
- package/dist/llm/ollama/serializer.d.ts +1 -0
- package/dist/llm/ollama/serializer.js +34 -12
- package/dist/llm/openai/chat.d.ts +16 -0
- package/dist/llm/openai/chat.js +94 -44
- package/dist/llm/openai/like.d.ts +5 -3
- package/dist/llm/openai/like.js +7 -3
- package/dist/llm/openai/responses-serializer.d.ts +18 -0
- package/dist/llm/openai/responses-serializer.js +72 -0
- package/dist/llm/openrouter/chat.d.ts +28 -2
- package/dist/llm/openrouter/chat.js +115 -29
- package/dist/llm/schema.d.ts +11 -1
- package/dist/llm/schema.js +109 -4
- package/dist/llm/vercel/chat.d.ts +50 -0
- package/dist/llm/vercel/chat.js +276 -0
- package/dist/llm/vercel/index.d.ts +1 -0
- package/dist/llm/vercel/index.js +1 -0
- package/dist/llm/vercel/serializer.d.ts +5 -0
- package/dist/llm/vercel/serializer.js +7 -0
- package/dist/llm/views.d.ts +2 -1
- package/dist/llm/views.js +3 -1
- package/dist/logging-config.d.ts +2 -0
- package/dist/logging-config.js +82 -29
- package/dist/mcp/client.d.ts +10 -5
- package/dist/mcp/client.js +14 -9
- package/dist/mcp/controller.d.ts +42 -3
- package/dist/mcp/controller.js +56 -31
- package/dist/mcp/server.d.ts +15 -0
- package/dist/mcp/server.js +261 -52
- package/dist/observability.js +10 -4
- package/dist/sandbox/index.d.ts +2 -0
- package/dist/sandbox/index.js +2 -0
- package/dist/sandbox/sandbox.d.ts +19 -0
- package/dist/sandbox/sandbox.js +140 -0
- package/dist/sandbox/views.d.ts +67 -0
- package/dist/sandbox/views.js +121 -0
- package/dist/skill-cli/index.d.ts +3 -0
- package/dist/skill-cli/index.js +3 -0
- package/dist/skill-cli/protocol.d.ts +30 -0
- package/dist/skill-cli/protocol.js +48 -0
- package/dist/skill-cli/server.d.ts +11 -0
- package/dist/skill-cli/server.js +85 -0
- package/dist/skill-cli/sessions.d.ts +24 -0
- package/dist/skill-cli/sessions.js +47 -0
- package/dist/skills/index.d.ts +3 -0
- package/dist/skills/index.js +3 -0
- package/dist/skills/service.d.ts +27 -0
- package/dist/skills/service.js +266 -0
- package/dist/skills/utils.d.ts +6 -0
- package/dist/skills/utils.js +53 -0
- package/dist/skills/views.d.ts +40 -0
- package/dist/skills/views.js +10 -0
- package/dist/sync/auth.js +8 -3
- package/dist/sync/service.d.ts +6 -6
- package/dist/sync/service.js +54 -89
- package/dist/telemetry/views.d.ts +20 -6
- package/dist/telemetry/views.js +23 -5
- package/dist/tokens/custom-pricing.d.ts +2 -0
- package/dist/tokens/custom-pricing.js +22 -0
- package/dist/tokens/index.d.ts +2 -0
- package/dist/tokens/index.js +2 -0
- package/dist/tokens/mappings.d.ts +1 -0
- package/dist/tokens/mappings.js +3 -0
- package/dist/tokens/service.js +27 -8
- package/dist/tools/extraction/index.d.ts +2 -0
- package/dist/tools/extraction/index.js +2 -0
- package/dist/tools/extraction/schema-utils.d.ts +6 -0
- package/dist/tools/extraction/schema-utils.js +237 -0
- package/dist/tools/extraction/views.d.ts +7 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.js +5 -0
- package/dist/tools/registry/index.d.ts +2 -0
- package/dist/tools/registry/index.js +2 -0
- package/dist/tools/registry/service.d.ts +1 -0
- package/dist/tools/registry/service.js +1 -0
- package/dist/tools/registry/views.d.ts +1 -0
- package/dist/tools/registry/views.js +1 -0
- package/dist/tools/service.d.ts +2 -0
- package/dist/tools/service.js +1 -0
- package/dist/tools/utils.d.ts +2 -0
- package/dist/tools/utils.js +57 -0
- package/dist/tools/views.d.ts +1 -0
- package/dist/tools/views.js +1 -0
- package/dist/utils.d.ts +10 -1
- package/dist/utils.js +70 -3
- package/package.json +116 -49
- package/dist/dom/playground/process-dom.js +0 -5
- package/dist/dom/playground/test-accessibility.d.ts +0 -44
- package/dist/dom/playground/test-accessibility.js +0 -111
- /package/dist/{dom/playground/process-dom.d.ts → tools/extraction/views.js} +0 -0
package/dist/browser/views.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ import type { DOMHistoryElement } from '../dom/history-tree-processor/view.js';
|
|
|
3
3
|
export declare const PLACEHOLDER_4PX_SCREENSHOT = "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAIAAAAmkwkpAAAAFElEQVR4nGP8//8/AwwwMSAB3BwAlm4DBfIlvvkAAAAASUVORK5CYII=";
|
|
4
4
|
export interface TabInfo {
|
|
5
5
|
page_id: number;
|
|
6
|
+
tab_id?: string;
|
|
7
|
+
target_id?: string;
|
|
6
8
|
url: string;
|
|
7
9
|
title: string;
|
|
8
10
|
parent_page_id?: number | null;
|
|
@@ -19,6 +21,19 @@ export interface PageInfo {
|
|
|
19
21
|
pixels_left: number;
|
|
20
22
|
pixels_right: number;
|
|
21
23
|
}
|
|
24
|
+
export interface NetworkRequest {
|
|
25
|
+
url: string;
|
|
26
|
+
method?: string;
|
|
27
|
+
loading_duration_ms?: number;
|
|
28
|
+
resource_type?: string | null;
|
|
29
|
+
}
|
|
30
|
+
export interface PaginationButton {
|
|
31
|
+
button_type: string;
|
|
32
|
+
backend_node_id: number;
|
|
33
|
+
text: string;
|
|
34
|
+
selector: string;
|
|
35
|
+
is_disabled?: boolean;
|
|
36
|
+
}
|
|
22
37
|
interface BrowserStateSummaryInit {
|
|
23
38
|
url: string;
|
|
24
39
|
title: string;
|
|
@@ -30,6 +45,10 @@ interface BrowserStateSummaryInit {
|
|
|
30
45
|
browser_errors?: string[];
|
|
31
46
|
is_pdf_viewer?: boolean;
|
|
32
47
|
loading_status?: string | null;
|
|
48
|
+
recent_events?: string | null;
|
|
49
|
+
pending_network_requests?: NetworkRequest[];
|
|
50
|
+
pagination_buttons?: PaginationButton[];
|
|
51
|
+
closed_popup_messages?: string[];
|
|
33
52
|
}
|
|
34
53
|
export declare class BrowserStateSummary extends DOMState {
|
|
35
54
|
url: string;
|
|
@@ -42,6 +61,10 @@ export declare class BrowserStateSummary extends DOMState {
|
|
|
42
61
|
browser_errors: string[];
|
|
43
62
|
is_pdf_viewer: boolean;
|
|
44
63
|
loading_status: string | null;
|
|
64
|
+
recent_events: string | null;
|
|
65
|
+
pending_network_requests: NetworkRequest[];
|
|
66
|
+
pagination_buttons: PaginationButton[];
|
|
67
|
+
closed_popup_messages: string[];
|
|
45
68
|
constructor(dom_state: DOMState, init: BrowserStateSummaryInit);
|
|
46
69
|
}
|
|
47
70
|
export declare class BrowserStateHistory {
|
|
@@ -66,12 +89,28 @@ export declare class BrowserStateHistory {
|
|
|
66
89
|
page_coordinates: import("../index.js").CoordinateSet | null;
|
|
67
90
|
viewport_coordinates: import("../index.js").CoordinateSet | null;
|
|
68
91
|
viewport_info: import("../index.js").ViewportInfo | null;
|
|
92
|
+
element_hash: string | null;
|
|
93
|
+
stable_hash: string | null;
|
|
94
|
+
ax_name: string | null;
|
|
69
95
|
} | null)[];
|
|
70
96
|
url: string;
|
|
71
97
|
title: string;
|
|
72
98
|
};
|
|
73
99
|
}
|
|
100
|
+
export interface BrowserErrorInit {
|
|
101
|
+
message: string;
|
|
102
|
+
short_term_memory?: string | null;
|
|
103
|
+
long_term_memory?: string | null;
|
|
104
|
+
details?: Record<string, unknown> | null;
|
|
105
|
+
event?: unknown;
|
|
106
|
+
}
|
|
74
107
|
export declare class BrowserError extends Error {
|
|
108
|
+
short_term_memory: string | null;
|
|
109
|
+
long_term_memory: string | null;
|
|
110
|
+
details: Record<string, unknown> | null;
|
|
111
|
+
while_handling_event: unknown;
|
|
112
|
+
constructor(messageOrInit: string | BrowserErrorInit, options?: Omit<BrowserErrorInit, 'message'>);
|
|
113
|
+
toString(): string;
|
|
75
114
|
}
|
|
76
115
|
export declare class URLNotAllowedError extends BrowserError {
|
|
77
116
|
}
|
package/dist/browser/views.js
CHANGED
|
@@ -13,6 +13,10 @@ export class BrowserStateSummary extends DOMState {
|
|
|
13
13
|
browser_errors;
|
|
14
14
|
is_pdf_viewer;
|
|
15
15
|
loading_status;
|
|
16
|
+
recent_events;
|
|
17
|
+
pending_network_requests;
|
|
18
|
+
pagination_buttons;
|
|
19
|
+
closed_popup_messages;
|
|
16
20
|
constructor(dom_state, init) {
|
|
17
21
|
super(dom_state.element_tree, dom_state.selector_map);
|
|
18
22
|
this.url = init.url;
|
|
@@ -25,6 +29,10 @@ export class BrowserStateSummary extends DOMState {
|
|
|
25
29
|
this.browser_errors = init.browser_errors ?? [];
|
|
26
30
|
this.is_pdf_viewer = init.is_pdf_viewer ?? false;
|
|
27
31
|
this.loading_status = init.loading_status ?? null;
|
|
32
|
+
this.recent_events = init.recent_events ?? null;
|
|
33
|
+
this.pending_network_requests = init.pending_network_requests ?? [];
|
|
34
|
+
this.pagination_buttons = init.pagination_buttons ?? [];
|
|
35
|
+
this.closed_popup_messages = init.closed_popup_messages ?? [];
|
|
28
36
|
}
|
|
29
37
|
}
|
|
30
38
|
export class BrowserStateHistory {
|
|
@@ -67,6 +75,30 @@ export class BrowserStateHistory {
|
|
|
67
75
|
}
|
|
68
76
|
}
|
|
69
77
|
export class BrowserError extends Error {
|
|
78
|
+
short_term_memory;
|
|
79
|
+
long_term_memory;
|
|
80
|
+
details;
|
|
81
|
+
while_handling_event;
|
|
82
|
+
constructor(messageOrInit, options) {
|
|
83
|
+
const init = typeof messageOrInit === 'string'
|
|
84
|
+
? { message: messageOrInit, ...(options ?? {}) }
|
|
85
|
+
: messageOrInit;
|
|
86
|
+
super(init.message);
|
|
87
|
+
this.name = 'BrowserError';
|
|
88
|
+
this.short_term_memory = init.short_term_memory ?? null;
|
|
89
|
+
this.long_term_memory = init.long_term_memory ?? null;
|
|
90
|
+
this.details = init.details ?? null;
|
|
91
|
+
this.while_handling_event = init.event ?? null;
|
|
92
|
+
}
|
|
93
|
+
toString() {
|
|
94
|
+
if (this.details) {
|
|
95
|
+
return `${this.message} (${JSON.stringify(this.details)})`;
|
|
96
|
+
}
|
|
97
|
+
if (this.while_handling_event) {
|
|
98
|
+
return `${this.message} (while handling: ${String(this.while_handling_event)})`;
|
|
99
|
+
}
|
|
100
|
+
return this.message;
|
|
101
|
+
}
|
|
70
102
|
}
|
|
71
103
|
export class URLNotAllowedError extends BrowserError {
|
|
72
104
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AboutBlankDVDScreensaverShownEvent, BrowserStopEvent, BrowserStoppedEvent, NavigateToUrlEvent, TabClosedEvent, TabCreatedEvent } from '../events.js';
|
|
2
|
+
import { BaseWatchdog } from './base.js';
|
|
3
|
+
export declare class AboutBlankWatchdog extends BaseWatchdog {
|
|
4
|
+
static LISTENS_TO: (typeof BrowserStopEvent | typeof BrowserStoppedEvent | typeof TabClosedEvent)[];
|
|
5
|
+
static EMITS: (typeof NavigateToUrlEvent | typeof AboutBlankDVDScreensaverShownEvent)[];
|
|
6
|
+
private _stopping;
|
|
7
|
+
on_BrowserStopEvent(): Promise<void>;
|
|
8
|
+
on_BrowserStoppedEvent(): Promise<void>;
|
|
9
|
+
on_TabClosedEvent(): Promise<void>;
|
|
10
|
+
on_TabCreatedEvent(event: TabCreatedEvent): Promise<void>;
|
|
11
|
+
private _injectDvdScreensaverOverlay;
|
|
12
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { AboutBlankDVDScreensaverShownEvent, BrowserStopEvent, BrowserStoppedEvent, NavigateToUrlEvent, TabClosedEvent, TabCreatedEvent, } from '../events.js';
|
|
2
|
+
import { BaseWatchdog } from './base.js';
|
|
3
|
+
export class AboutBlankWatchdog extends BaseWatchdog {
|
|
4
|
+
static LISTENS_TO = [
|
|
5
|
+
BrowserStopEvent,
|
|
6
|
+
BrowserStoppedEvent,
|
|
7
|
+
TabClosedEvent,
|
|
8
|
+
TabCreatedEvent,
|
|
9
|
+
];
|
|
10
|
+
static EMITS = [
|
|
11
|
+
NavigateToUrlEvent,
|
|
12
|
+
AboutBlankDVDScreensaverShownEvent,
|
|
13
|
+
];
|
|
14
|
+
_stopping = false;
|
|
15
|
+
async on_BrowserStopEvent() {
|
|
16
|
+
this._stopping = true;
|
|
17
|
+
}
|
|
18
|
+
async on_BrowserStoppedEvent() {
|
|
19
|
+
this._stopping = true;
|
|
20
|
+
}
|
|
21
|
+
async on_TabClosedEvent() {
|
|
22
|
+
if (this._stopping) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (this.browser_session.tabs.length > 0) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
await this.event_bus.dispatch(new NavigateToUrlEvent({
|
|
29
|
+
url: 'about:blank',
|
|
30
|
+
new_tab: true,
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
async on_TabCreatedEvent(event) {
|
|
34
|
+
if (this._stopping) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (event.url !== 'about:blank') {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
let injectionError = null;
|
|
41
|
+
try {
|
|
42
|
+
await this._injectDvdScreensaverOverlay();
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
injectionError =
|
|
46
|
+
error.message || 'DVD overlay injection failed';
|
|
47
|
+
}
|
|
48
|
+
await this.event_bus.dispatch(new AboutBlankDVDScreensaverShownEvent({
|
|
49
|
+
target_id: event.target_id,
|
|
50
|
+
error: injectionError,
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
async _injectDvdScreensaverOverlay() {
|
|
54
|
+
const page = await this.browser_session.get_current_page();
|
|
55
|
+
if (!page?.evaluate || !page.url) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const currentUrl = page.url();
|
|
59
|
+
if (currentUrl !== 'about:blank') {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
await page.evaluate(() => {
|
|
63
|
+
if (window.__dvdAnimationRunning) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
window.__dvdAnimationRunning = true;
|
|
67
|
+
const existing = document.getElementById('pretty-loading-animation');
|
|
68
|
+
if (existing) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const ensureBody = () => {
|
|
72
|
+
if (!document.body) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
const overlay = document.createElement('div');
|
|
76
|
+
overlay.id = 'pretty-loading-animation';
|
|
77
|
+
overlay.style.position = 'fixed';
|
|
78
|
+
overlay.style.top = '0';
|
|
79
|
+
overlay.style.left = '0';
|
|
80
|
+
overlay.style.width = '100vw';
|
|
81
|
+
overlay.style.height = '100vh';
|
|
82
|
+
overlay.style.background = '#000';
|
|
83
|
+
overlay.style.zIndex = '99999';
|
|
84
|
+
overlay.style.overflow = 'hidden';
|
|
85
|
+
const img = document.createElement('img');
|
|
86
|
+
img.src = 'https://cf.browser-use.com/logo.svg';
|
|
87
|
+
img.alt = 'Browser-Use';
|
|
88
|
+
img.style.width = '180px';
|
|
89
|
+
img.style.height = 'auto';
|
|
90
|
+
img.style.position = 'absolute';
|
|
91
|
+
img.style.left = '0px';
|
|
92
|
+
img.style.top = '0px';
|
|
93
|
+
img.style.opacity = '0.85';
|
|
94
|
+
overlay.appendChild(img);
|
|
95
|
+
document.body.appendChild(overlay);
|
|
96
|
+
let x = Math.random() * Math.max(20, window.innerWidth - 200);
|
|
97
|
+
let y = Math.random() * Math.max(20, window.innerHeight - 120);
|
|
98
|
+
let dx = 1.4;
|
|
99
|
+
let dy = 1.2;
|
|
100
|
+
const animate = () => {
|
|
101
|
+
if (!document.getElementById('pretty-loading-animation')) {
|
|
102
|
+
window.__dvdAnimationRunning = false;
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const imgWidth = img.offsetWidth || 180;
|
|
106
|
+
const imgHeight = img.offsetHeight || 80;
|
|
107
|
+
x += dx;
|
|
108
|
+
y += dy;
|
|
109
|
+
if (x <= 0 || x + imgWidth >= window.innerWidth) {
|
|
110
|
+
dx = -dx;
|
|
111
|
+
x = Math.max(0, Math.min(x, window.innerWidth - imgWidth));
|
|
112
|
+
}
|
|
113
|
+
if (y <= 0 || y + imgHeight >= window.innerHeight) {
|
|
114
|
+
dy = -dy;
|
|
115
|
+
y = Math.max(0, Math.min(y, window.innerHeight - imgHeight));
|
|
116
|
+
}
|
|
117
|
+
img.style.left = `${x}px`;
|
|
118
|
+
img.style.top = `${y}px`;
|
|
119
|
+
requestAnimationFrame(animate);
|
|
120
|
+
};
|
|
121
|
+
requestAnimationFrame(animate);
|
|
122
|
+
return true;
|
|
123
|
+
};
|
|
124
|
+
if (!ensureBody() && document.readyState === 'loading') {
|
|
125
|
+
document.addEventListener('DOMContentLoaded', ensureBody, {
|
|
126
|
+
once: true,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { EventBus, EventPayload, EventTypeReference } from '../../event-bus.js';
|
|
2
|
+
import type { BrowserSession } from '../session.js';
|
|
3
|
+
export interface BaseWatchdogInit {
|
|
4
|
+
browser_session: BrowserSession;
|
|
5
|
+
event_bus?: EventBus;
|
|
6
|
+
}
|
|
7
|
+
export declare abstract class BaseWatchdog {
|
|
8
|
+
static LISTENS_TO: EventTypeReference<EventPayload>[];
|
|
9
|
+
static EMITS: EventTypeReference<EventPayload>[];
|
|
10
|
+
protected readonly browser_session: BrowserSession;
|
|
11
|
+
protected readonly event_bus: EventBus;
|
|
12
|
+
private _attached;
|
|
13
|
+
private _registeredHandlers;
|
|
14
|
+
constructor(init: BaseWatchdogInit);
|
|
15
|
+
get is_attached(): boolean;
|
|
16
|
+
attach_to_session(): void;
|
|
17
|
+
detach_from_session(): void;
|
|
18
|
+
protected onAttached(): void;
|
|
19
|
+
protected onDetached(): void;
|
|
20
|
+
private _collectHandlerMethods;
|
|
21
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
const resolveEventType = (eventTypeRef) => typeof eventTypeRef === 'string' ? eventTypeRef : eventTypeRef.name;
|
|
2
|
+
export class BaseWatchdog {
|
|
3
|
+
static LISTENS_TO = [];
|
|
4
|
+
static EMITS = [];
|
|
5
|
+
browser_session;
|
|
6
|
+
event_bus;
|
|
7
|
+
_attached = false;
|
|
8
|
+
_registeredHandlers = [];
|
|
9
|
+
constructor(init) {
|
|
10
|
+
this.browser_session = init.browser_session;
|
|
11
|
+
this.event_bus = init.event_bus ?? init.browser_session.event_bus;
|
|
12
|
+
}
|
|
13
|
+
get is_attached() {
|
|
14
|
+
return this._attached;
|
|
15
|
+
}
|
|
16
|
+
attach_to_session() {
|
|
17
|
+
if (this._attached) {
|
|
18
|
+
throw new Error(`[${this.constructor.name}] attach_to_session() called twice`);
|
|
19
|
+
}
|
|
20
|
+
const handlerMethods = this._collectHandlerMethods();
|
|
21
|
+
const declaredListenEvents = new Set(this.constructor.LISTENS_TO.map(resolveEventType));
|
|
22
|
+
const registeredEventTypes = new Set();
|
|
23
|
+
for (const methodName of handlerMethods) {
|
|
24
|
+
const event_type = methodName.slice(3);
|
|
25
|
+
if (declaredListenEvents.size > 0 &&
|
|
26
|
+
!declaredListenEvents.has(event_type)) {
|
|
27
|
+
throw new Error(`[${this.constructor.name}] Handler ${methodName} listens to ${event_type} but ${event_type} is not declared in LISTENS_TO`);
|
|
28
|
+
}
|
|
29
|
+
const handler_id = `${this.constructor.name}.${methodName}`;
|
|
30
|
+
const method = this[methodName];
|
|
31
|
+
if (typeof method !== 'function') {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const bound = method.bind(this);
|
|
35
|
+
this.event_bus.on(event_type, bound, { handler_id });
|
|
36
|
+
this._registeredHandlers.push({ event_type, handler_id });
|
|
37
|
+
registeredEventTypes.add(event_type);
|
|
38
|
+
}
|
|
39
|
+
if (declaredListenEvents.size > 0) {
|
|
40
|
+
const missing = [...declaredListenEvents].filter((eventType) => !registeredEventTypes.has(eventType));
|
|
41
|
+
if (missing.length > 0) {
|
|
42
|
+
throw new Error(`[${this.constructor.name}] LISTENS_TO declares ${missing.join(', ')} but no matching on_<EventName> handlers were found`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
this._attached = true;
|
|
46
|
+
this.onAttached();
|
|
47
|
+
}
|
|
48
|
+
detach_from_session() {
|
|
49
|
+
if (!this._attached) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
for (const { event_type, handler_id } of this._registeredHandlers) {
|
|
53
|
+
this.event_bus.off(event_type, handler_id);
|
|
54
|
+
}
|
|
55
|
+
this._registeredHandlers = [];
|
|
56
|
+
this._attached = false;
|
|
57
|
+
this.onDetached();
|
|
58
|
+
}
|
|
59
|
+
onAttached() { }
|
|
60
|
+
onDetached() { }
|
|
61
|
+
_collectHandlerMethods() {
|
|
62
|
+
const methodNames = new Set();
|
|
63
|
+
let prototype = Object.getPrototypeOf(this);
|
|
64
|
+
while (prototype && prototype !== BaseWatchdog.prototype) {
|
|
65
|
+
for (const name of Object.getOwnPropertyNames(prototype)) {
|
|
66
|
+
if (!name.startsWith('on_')) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (name.length <= 3) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const descriptor = Object.getOwnPropertyDescriptor(prototype, name);
|
|
73
|
+
if (typeof descriptor?.value === 'function') {
|
|
74
|
+
methodNames.add(name);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
prototype = Object.getPrototypeOf(prototype);
|
|
78
|
+
}
|
|
79
|
+
return [...methodNames];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BrowserConnectedEvent, BrowserStoppedEvent } from '../events.js';
|
|
2
|
+
import { BaseWatchdog } from './base.js';
|
|
3
|
+
export declare class CDPSessionWatchdog extends BaseWatchdog {
|
|
4
|
+
static LISTENS_TO: (typeof BrowserConnectedEvent | typeof BrowserStoppedEvent)[];
|
|
5
|
+
private _rootCdpSession;
|
|
6
|
+
private _listeners;
|
|
7
|
+
private _knownTargets;
|
|
8
|
+
on_BrowserConnectedEvent(): Promise<void>;
|
|
9
|
+
on_BrowserStoppedEvent(): Promise<void>;
|
|
10
|
+
protected onDetached(): void;
|
|
11
|
+
private _ensureCdpMonitoring;
|
|
12
|
+
private _teardownCdpMonitoring;
|
|
13
|
+
private _dispatchEventSafely;
|
|
14
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { BrowserConnectedEvent, BrowserStoppedEvent, NavigationCompleteEvent, TabClosedEvent, TabCreatedEvent, } from '../events.js';
|
|
2
|
+
import { BaseWatchdog } from './base.js';
|
|
3
|
+
export class CDPSessionWatchdog extends BaseWatchdog {
|
|
4
|
+
static LISTENS_TO = [BrowserConnectedEvent, BrowserStoppedEvent];
|
|
5
|
+
_rootCdpSession = null;
|
|
6
|
+
_listeners = [];
|
|
7
|
+
_knownTargets = new Map();
|
|
8
|
+
async on_BrowserConnectedEvent() {
|
|
9
|
+
await this._ensureCdpMonitoring();
|
|
10
|
+
}
|
|
11
|
+
async on_BrowserStoppedEvent() {
|
|
12
|
+
await this._teardownCdpMonitoring();
|
|
13
|
+
}
|
|
14
|
+
onDetached() {
|
|
15
|
+
void this._teardownCdpMonitoring();
|
|
16
|
+
}
|
|
17
|
+
async _ensureCdpMonitoring() {
|
|
18
|
+
if (this._rootCdpSession) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (!this.browser_session.browser_context?.newCDPSession) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const page = await this.browser_session.get_current_page();
|
|
25
|
+
if (!page) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const cdpSession = (await this.browser_session.get_or_create_cdp_session(page));
|
|
30
|
+
this._rootCdpSession = cdpSession;
|
|
31
|
+
await cdpSession.send?.('Target.setDiscoverTargets', {
|
|
32
|
+
discover: true,
|
|
33
|
+
filter: [{ type: 'page' }, { type: 'iframe' }],
|
|
34
|
+
});
|
|
35
|
+
const targetsPayload = await cdpSession.send?.('Target.getTargets');
|
|
36
|
+
const targetInfos = Array.isArray(targetsPayload?.targetInfos)
|
|
37
|
+
? targetsPayload.targetInfos
|
|
38
|
+
: [];
|
|
39
|
+
for (const targetInfo of targetInfos) {
|
|
40
|
+
const target_id = String(targetInfo?.targetId ?? '');
|
|
41
|
+
if (!target_id) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
this.browser_session.session_manager.handle_target_info_changed({
|
|
45
|
+
target_id,
|
|
46
|
+
target_type: typeof targetInfo?.type === 'string' ? targetInfo.type : 'page',
|
|
47
|
+
url: typeof targetInfo?.url === 'string' ? targetInfo.url : '',
|
|
48
|
+
title: typeof targetInfo?.title === 'string' ? targetInfo.title : '',
|
|
49
|
+
});
|
|
50
|
+
this._knownTargets.set(target_id, {
|
|
51
|
+
target_type: typeof targetInfo?.type === 'string' ? targetInfo.type : 'page',
|
|
52
|
+
url: typeof targetInfo?.url === 'string' ? targetInfo.url : '',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const onAttached = (payload) => {
|
|
56
|
+
const targetInfo = payload?.targetInfo ?? {};
|
|
57
|
+
const target_id = String(targetInfo?.targetId ?? '');
|
|
58
|
+
if (!target_id) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const target_type = typeof targetInfo?.type === 'string' ? targetInfo.type : 'page';
|
|
62
|
+
const url = typeof targetInfo?.url === 'string' ? targetInfo.url : '';
|
|
63
|
+
const isNewTarget = !this._knownTargets.has(target_id);
|
|
64
|
+
this._knownTargets.set(target_id, {
|
|
65
|
+
target_type,
|
|
66
|
+
url,
|
|
67
|
+
});
|
|
68
|
+
this.browser_session.session_manager.handle_target_attached({
|
|
69
|
+
target_id,
|
|
70
|
+
session_id: typeof payload?.sessionId === 'string' ? payload.sessionId : null,
|
|
71
|
+
target_type,
|
|
72
|
+
url,
|
|
73
|
+
title: typeof targetInfo?.title === 'string' ? targetInfo.title : '',
|
|
74
|
+
});
|
|
75
|
+
if (isNewTarget && target_type === 'page') {
|
|
76
|
+
this._dispatchEventSafely(new TabCreatedEvent({
|
|
77
|
+
target_id,
|
|
78
|
+
url,
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
const onDetached = (payload) => {
|
|
83
|
+
const target_id = String(payload?.targetId ?? '');
|
|
84
|
+
if (!target_id) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const knownTarget = this._knownTargets.get(target_id);
|
|
88
|
+
this._knownTargets.delete(target_id);
|
|
89
|
+
this.browser_session.session_manager.handle_target_detached({
|
|
90
|
+
target_id,
|
|
91
|
+
session_id: typeof payload?.sessionId === 'string' ? payload.sessionId : null,
|
|
92
|
+
});
|
|
93
|
+
if (knownTarget?.target_type === 'page') {
|
|
94
|
+
this._dispatchEventSafely(new TabClosedEvent({
|
|
95
|
+
target_id,
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const onTargetInfoChanged = (payload) => {
|
|
100
|
+
const targetInfo = payload?.targetInfo ?? {};
|
|
101
|
+
const target_id = String(targetInfo?.targetId ?? '');
|
|
102
|
+
if (!target_id) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const knownTarget = this._knownTargets.get(target_id);
|
|
106
|
+
const target_type = typeof targetInfo?.type === 'string'
|
|
107
|
+
? targetInfo.type
|
|
108
|
+
: (knownTarget?.target_type ?? 'page');
|
|
109
|
+
const url = typeof targetInfo?.url === 'string'
|
|
110
|
+
? targetInfo.url
|
|
111
|
+
: (knownTarget?.url ?? '');
|
|
112
|
+
this._knownTargets.set(target_id, {
|
|
113
|
+
target_type,
|
|
114
|
+
url,
|
|
115
|
+
});
|
|
116
|
+
this.browser_session.session_manager.handle_target_info_changed({
|
|
117
|
+
target_id,
|
|
118
|
+
target_type,
|
|
119
|
+
url,
|
|
120
|
+
title: typeof targetInfo?.title === 'string' ? targetInfo.title : '',
|
|
121
|
+
});
|
|
122
|
+
if (!knownTarget && target_type === 'page') {
|
|
123
|
+
this._dispatchEventSafely(new TabCreatedEvent({
|
|
124
|
+
target_id,
|
|
125
|
+
url,
|
|
126
|
+
}));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (knownTarget?.target_type === 'page' && knownTarget.url !== url) {
|
|
130
|
+
this._dispatchEventSafely(new NavigationCompleteEvent({
|
|
131
|
+
target_id,
|
|
132
|
+
url,
|
|
133
|
+
status: null,
|
|
134
|
+
error_message: null,
|
|
135
|
+
loading_status: null,
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
cdpSession.on?.('Target.attachedToTarget', onAttached);
|
|
140
|
+
cdpSession.on?.('Target.detachedFromTarget', onDetached);
|
|
141
|
+
cdpSession.on?.('Target.targetInfoChanged', onTargetInfoChanged);
|
|
142
|
+
this._listeners = [
|
|
143
|
+
{ event: 'Target.attachedToTarget', handler: onAttached },
|
|
144
|
+
{ event: 'Target.detachedFromTarget', handler: onDetached },
|
|
145
|
+
{ event: 'Target.targetInfoChanged', handler: onTargetInfoChanged },
|
|
146
|
+
];
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
this.browser_session.logger.debug(`CDPSessionWatchdog monitoring unavailable: ${error.message}`);
|
|
150
|
+
await this._teardownCdpMonitoring();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async _teardownCdpMonitoring() {
|
|
154
|
+
if (!this._rootCdpSession) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
for (const listener of this._listeners) {
|
|
158
|
+
this._rootCdpSession.off?.(listener.event, listener.handler);
|
|
159
|
+
}
|
|
160
|
+
this._listeners = [];
|
|
161
|
+
try {
|
|
162
|
+
await this._rootCdpSession.detach?.();
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Ignore CDP detach errors during shutdown.
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
this._rootCdpSession = null;
|
|
169
|
+
this._knownTargets.clear();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
_dispatchEventSafely(event) {
|
|
173
|
+
void this.event_bus.dispatch(event).catch((error) => {
|
|
174
|
+
this.browser_session.logger.debug(`CDPSessionWatchdog failed to dispatch ${String(event?.event_name ?? 'event')}: ${error.message}`);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { BrowserConnectedEvent, BrowserErrorEvent, BrowserStoppedEvent, TabClosedEvent, TargetCrashedEvent } from '../events.js';
|
|
2
|
+
import { BaseWatchdog } from './base.js';
|
|
3
|
+
export declare class CrashWatchdog extends BaseWatchdog {
|
|
4
|
+
static LISTENS_TO: (typeof BrowserConnectedEvent | typeof BrowserStoppedEvent | typeof TabClosedEvent)[];
|
|
5
|
+
static EMITS: (typeof TargetCrashedEvent | typeof BrowserErrorEvent)[];
|
|
6
|
+
private _pageListeners;
|
|
7
|
+
private _pendingRequests;
|
|
8
|
+
private _requestIds;
|
|
9
|
+
private _requestCounter;
|
|
10
|
+
private _healthInterval;
|
|
11
|
+
private _networkTimeoutMs;
|
|
12
|
+
private _healthCheckIntervalMs;
|
|
13
|
+
private _consecutiveUnresponsiveChecks;
|
|
14
|
+
private _unresponsiveThreshold;
|
|
15
|
+
private _monitoringInProgress;
|
|
16
|
+
on_BrowserConnectedEvent(): Promise<void>;
|
|
17
|
+
on_TabCreatedEvent(): Promise<void>;
|
|
18
|
+
on_TabClosedEvent(): Promise<void>;
|
|
19
|
+
on_BrowserStoppedEvent(): Promise<void>;
|
|
20
|
+
protected onDetached(): void;
|
|
21
|
+
private _attachToKnownPages;
|
|
22
|
+
private _dropDetachedPages;
|
|
23
|
+
private _detachAllPages;
|
|
24
|
+
private _attachPage;
|
|
25
|
+
private _detachPageListeners;
|
|
26
|
+
private _getKnownPages;
|
|
27
|
+
private _handlePageCrash;
|
|
28
|
+
private _resolveTargetId;
|
|
29
|
+
private _safePageUrl;
|
|
30
|
+
private _normalizeCrashError;
|
|
31
|
+
private _trackRequestStart;
|
|
32
|
+
private _trackRequestDone;
|
|
33
|
+
private _startHealthMonitor;
|
|
34
|
+
private _stopHealthMonitor;
|
|
35
|
+
private _runHealthCheck;
|
|
36
|
+
private _checkNetworkTimeouts;
|
|
37
|
+
private _checkPageResponsiveness;
|
|
38
|
+
}
|