Skip to content

Commit 21e4331

Browse files
authored
fix(browser-ui, browser): enhance tabs handling and script injection (#106)
Co-authored-by: skychx <skychx.hotmail.com>
1 parent 7f749dd commit 21e4331

File tree

8 files changed

+55
-21
lines changed

8 files changed

+55
-21
lines changed

packages/browser-ui/src/model/tabs.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,19 @@ export class UITabs extends Tabs<UITab> {
3232
this.#options = options;
3333
}
3434

35-
override createTabInstance(page: Page, options: TabOptions): UITab {
35+
override async createTabInstance(
36+
page: Page,
37+
options: TabOptions,
38+
): Promise<UITab> {
3639
const uiOptions: UITabOptions = {
3740
...options,
3841
cast: this.#options.cast,
42+
injectVisibilityScript: true,
3943
};
40-
return new UITab(page, this.#canvas, uiOptions);
44+
const tab = new UITab(page, this.#canvas, uiOptions);
45+
await tab.init();
46+
47+
return tab;
4148
}
4249
}
4350

packages/browser-ui/src/types/model.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,7 @@ export interface UITabsOptions extends TabsOptions {
3434
cast?: CastOptions;
3535
}
3636

37-
export type ScreenCastOptions = Omit<UITabOptions, 'envInfo' | 'userAgentInfo'>;
37+
export type ScreenCastOptions = Omit<
38+
UITabOptions,
39+
'envInfo' | 'userAgentInfo' | 'injectVisibilityScript'
40+
>;

packages/browser/src/injected-script/visibility.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99

1010
export const visibilityScript = /* javascript */ `
1111
function agentInfraVisibilityScript() {
12+
if (window.__agent_infra_browser.visibility) {
13+
return;
14+
}
15+
window.__agent_infra_browser.visibility = true;
16+
1217
if (window.top !== window) {
1318
return;
1419
}

packages/browser/src/injected-script/webdriver.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77

88
export const disableWebdriver = /* javascript */ `
99
function agentInfraDriver() {
10+
if (window.__agent_infra_browser.webdriver) {
11+
return;
12+
}
13+
window.__agent_infra_browser.webdriver = true;
14+
1015
delete navigator.webdriver;
1116
1217
const originalNavigator = navigator;

packages/browser/src/tabs/tab.ts

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export class Tab extends EventEmitter<TabEventsMap> {
4040
#isLoading = false;
4141
#reloadAbortController: AbortController | null = null;
4242

43-
#scriptsOnCreate: string[] = [disableWebdriver, visibilityScript];
43+
#scriptsOnCreate: string[] = [disableWebdriver];
4444
#scriptsOnLoad: string[] = [];
4545

4646
constructor(page: Page, options: TabOptions) {
@@ -58,20 +58,26 @@ export class Tab extends EventEmitter<TabEventsMap> {
5858
this.#keyboard = new Keyboard(page, this.#tabDialog, options.envInfo);
5959
this.#mouse = new Mouse(page, this.#tabDialog);
6060

61-
this.#setupVisibilityTracking();
62-
this.#executeScriptsOnCreate();
63-
64-
// Set user agent if provided
65-
if (options.userAgentInfo) {
66-
this.#pptrPage.setUserAgent(options.userAgentInfo);
67-
}
68-
6961
// page events: https://pptr.dev/api/puppeteer.pageevent
7062
this.#pptrPage.on('domcontentloaded', this.#dclHandler);
7163
this.#pptrPage.on('load', this.#loadHandler);
7264
this.#pptrPage.on('framenavigated', this.#frameNavigatedHandler);
7365
}
7466

67+
async init() {
68+
// Only setup visibility tracking if visibility script is injected
69+
if (this.#options.injectVisibilityScript) {
70+
this.#scriptsOnCreate.push(visibilityScript);
71+
await this.#setupVisibilityTracking();
72+
}
73+
74+
await this.#executeScriptsOnCreate();
75+
76+
if (this.#options.userAgentInfo) {
77+
await this.#pptrPage.setUserAgent(this.#options.userAgentInfo);
78+
}
79+
}
80+
7581
// #region meta info
7682

7783
get tabId() {
@@ -464,8 +470,10 @@ export class Tab extends EventEmitter<TabEventsMap> {
464470
async #executeScriptsOnCreate() {
465471
try {
466472
const script = iife(this.#scriptsOnCreate.join('\n'));
467-
await this.#pptrPage.evaluateOnNewDocument(script);
468-
await this.#pptrPage.evaluate(script);
473+
await Promise.race([
474+
this.#pptrPage.evaluateOnNewDocument(script),
475+
this.#pptrPage.evaluate(script),
476+
]);
469477
} catch (error) {
470478
console.warn('Failed to execute script on create:', error);
471479
}

packages/browser/src/tabs/tabs.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,14 @@ export class Tabs<T extends Tab = Tab> {
7070
};
7171
}
7272

73-
protected createTabInstance(page: Page, options: TabOptions): T {
74-
return new Tab(page, options) as T;
73+
protected async createTabInstance(
74+
page: Page,
75+
options: TabOptions,
76+
): Promise<T> {
77+
const tab = new Tab(page, options) as T;
78+
await tab.init();
79+
80+
return tab;
7581
}
7682

7783
// #region init ExistingTabs
@@ -91,7 +97,7 @@ export class Tabs<T extends Tab = Tab> {
9197
.map(async (pptrPage) => {
9298
// @ts-ignore
9399
const tabId = pptrPage.target()._targetId;
94-
const tab = this.createTabInstance(pptrPage, {
100+
const tab = await this.createTabInstance(pptrPage, {
95101
tabId: tabId,
96102
...this.#options,
97103
});
@@ -127,7 +133,7 @@ export class Tabs<T extends Tab = Tab> {
127133
}
128134
this.#operations.creatingTargetIds.add(targetId);
129135

130-
const tab = this.createTabInstance(pptrPage, {
136+
const tab = await this.createTabInstance(pptrPage, {
131137
tabId: targetId,
132138
...this.#options,
133139
});

packages/browser/src/types/tabs.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export interface TabsOptions {
2020

2121
export interface TabOptions extends TabsOptions {
2222
tabId: string;
23+
injectVisibilityScript?: boolean;
2324
}
2425

2526
export const enum TabEvents {

packages/browser/src/utils/iife.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55
export const iife = (script: string) => /* javascript */ `(() => {
6-
if (window.__agent_infra_injected_script) {
7-
return;
6+
if (!window.__agent_infra_browser) {
7+
window.__agent_infra_browser = {};
88
}
9-
window.__agent_infra_injected_script = true;
109
${script}
1110
})();`;

0 commit comments

Comments
 (0)