@agent-infra/browser 0.2.0-alpha.5 → 0.2.1
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/dist/actions/keyboard.d.ts.map +1 -1
- package/dist/actions/keyboard.js +4 -4
- package/dist/actions/keyboard.js.map +1 -1
- package/dist/actions/keyboard.mjs +4 -4
- package/dist/actions/keyboard.mjs.map +1 -1
- package/dist/browser/browser.d.ts +3 -1
- package/dist/browser/browser.d.ts.map +1 -1
- package/dist/browser/browser.js +4 -2
- package/dist/browser/browser.js.map +1 -1
- package/dist/browser/browser.mjs +4 -2
- package/dist/browser/browser.mjs.map +1 -1
- package/dist/injected-script/visibility.d.ts +1 -1
- package/dist/injected-script/visibility.d.ts.map +1 -1
- package/dist/injected-script/visibility.js +5 -0
- package/dist/injected-script/visibility.js.map +1 -1
- package/dist/injected-script/visibility.mjs +5 -0
- package/dist/injected-script/visibility.mjs.map +1 -1
- package/dist/injected-script/webdriver.d.ts +1 -1
- package/dist/injected-script/webdriver.d.ts.map +1 -1
- package/dist/injected-script/webdriver.js +5 -0
- package/dist/injected-script/webdriver.js.map +1 -1
- package/dist/injected-script/webdriver.mjs +5 -0
- package/dist/injected-script/webdriver.mjs.map +1 -1
- package/dist/tabs/tab.d.ts +1 -0
- package/dist/tabs/tab.d.ts.map +1 -1
- package/dist/tabs/tab.js +50 -36
- package/dist/tabs/tab.js.map +1 -1
- package/dist/tabs/tab.mjs +40 -36
- package/dist/tabs/tab.mjs.map +1 -1
- package/dist/tabs/tabs.d.ts +1 -1
- package/dist/tabs/tabs.d.ts.map +1 -1
- package/dist/tabs/tabs.js +7 -17
- package/dist/tabs/tabs.js.map +1 -1
- package/dist/tabs/tabs.mjs +7 -17
- package/dist/tabs/tabs.mjs.map +1 -1
- package/dist/types/tabs.d.ts +1 -4
- package/dist/types/tabs.d.ts.map +1 -1
- package/dist/types/tabs.js.map +1 -1
- package/dist/types/tabs.mjs.map +1 -1
- package/dist/utils/iife.d.ts.map +1 -1
- package/dist/utils/iife.js +2 -3
- package/dist/utils/iife.js.map +1 -1
- package/dist/utils/iife.mjs +2 -3
- package/dist/utils/iife.mjs.map +1 -1
- package/package.json +3 -3
package/dist/tabs/tab.js
CHANGED
|
@@ -4,6 +4,15 @@
|
|
|
4
4
|
*/
|
|
5
5
|
"use strict";
|
|
6
6
|
var __webpack_require__ = {};
|
|
7
|
+
(()=>{
|
|
8
|
+
__webpack_require__.n = (module)=>{
|
|
9
|
+
var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
|
|
10
|
+
__webpack_require__.d(getter, {
|
|
11
|
+
a: getter
|
|
12
|
+
});
|
|
13
|
+
return getter;
|
|
14
|
+
};
|
|
15
|
+
})();
|
|
7
16
|
(()=>{
|
|
8
17
|
__webpack_require__.d = (exports1, definition)=>{
|
|
9
18
|
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
@@ -30,6 +39,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
30
39
|
__webpack_require__.d(__webpack_exports__, {
|
|
31
40
|
Tab: ()=>Tab
|
|
32
41
|
});
|
|
42
|
+
const external_delay_namespaceObject = require("delay");
|
|
43
|
+
var external_delay_default = /*#__PURE__*/ __webpack_require__.n(external_delay_namespaceObject);
|
|
33
44
|
const external_eventemitter3_namespaceObject = require("eventemitter3");
|
|
34
45
|
const media_utils_namespaceObject = require("@agent-infra/media-utils");
|
|
35
46
|
const index_js_namespaceObject = require("../injected-script/index.js");
|
|
@@ -137,8 +148,16 @@ function tab_ts_dispose_resources(env) {
|
|
|
137
148
|
return next();
|
|
138
149
|
})(env);
|
|
139
150
|
}
|
|
140
|
-
var _id = /*#__PURE__*/ new WeakMap(), _options = /*#__PURE__*/ new WeakMap(), _status = /*#__PURE__*/ new WeakMap(), _pptrPage = /*#__PURE__*/ new WeakMap(), _url = /*#__PURE__*/ new WeakMap(), _favicon = /*#__PURE__*/ new WeakMap(), _title = /*#__PURE__*/ new WeakMap(), _tabDialog = /*#__PURE__*/ new WeakMap(), _keyboard = /*#__PURE__*/ new WeakMap(), _mouse = /*#__PURE__*/ new WeakMap(), _isLoading = /*#__PURE__*/ new WeakMap(), _reloadAbortController = /*#__PURE__*/ new WeakMap(), _scriptsOnCreate = /*#__PURE__*/ new WeakMap(), _scriptsOnLoad = /*#__PURE__*/ new WeakMap(), _dclHandler = /*#__PURE__*/ new WeakMap(), _loadHandler = /*#__PURE__*/ new WeakMap(), _frameNavigatedHandler = /*#__PURE__*/ new WeakMap(), _backMutex = /*#__PURE__*/ new WeakMap(), _forwardMutex = /*#__PURE__*/ new WeakMap(), _reloadMutex = /*#__PURE__*/ new WeakMap(), _onFrameNavigated = /*#__PURE__*/ new WeakSet(), _setupVisibilityTracking = /*#__PURE__*/ new WeakSet(), _executeScriptsOnCreate = /*#__PURE__*/ new WeakSet(), _executeScriptsOnLoad = /*#__PURE__*/ new WeakSet(), _getFavicon = /*#__PURE__*/ new WeakSet(), _setLoading = /*#__PURE__*/ new WeakSet();
|
|
151
|
+
var _id = /*#__PURE__*/ new WeakMap(), _options = /*#__PURE__*/ new WeakMap(), _status = /*#__PURE__*/ new WeakMap(), _pptrPage = /*#__PURE__*/ new WeakMap(), _url = /*#__PURE__*/ new WeakMap(), _favicon = /*#__PURE__*/ new WeakMap(), _title = /*#__PURE__*/ new WeakMap(), _tabDialog = /*#__PURE__*/ new WeakMap(), _keyboard = /*#__PURE__*/ new WeakMap(), _mouse = /*#__PURE__*/ new WeakMap(), _isLoading = /*#__PURE__*/ new WeakMap(), _reloadAbortController = /*#__PURE__*/ new WeakMap(), _scriptsOnCreate = /*#__PURE__*/ new WeakMap(), _scriptsOnLoad = /*#__PURE__*/ new WeakMap(), _dclHandler = /*#__PURE__*/ new WeakMap(), _loadHandler = /*#__PURE__*/ new WeakMap(), _frameNavigatedHandler = /*#__PURE__*/ new WeakMap(), _backMutex = /*#__PURE__*/ new WeakMap(), _forwardMutex = /*#__PURE__*/ new WeakMap(), _reloadMutex = /*#__PURE__*/ new WeakMap(), _onFrameNavigated = /*#__PURE__*/ new WeakSet(), _setupVisibilityTracking = /*#__PURE__*/ new WeakSet(), _executeScriptsOnCreate = /*#__PURE__*/ new WeakSet(), _executeScriptsOnLoad = /*#__PURE__*/ new WeakSet(), _getTitle = /*#__PURE__*/ new WeakSet(), _getFavicon = /*#__PURE__*/ new WeakSet(), _setLoading = /*#__PURE__*/ new WeakSet();
|
|
141
152
|
class Tab extends external_eventemitter3_namespaceObject.EventEmitter {
|
|
153
|
+
async init() {
|
|
154
|
+
if (_class_private_field_get(this, _options).injectVisibilityScript) {
|
|
155
|
+
_class_private_field_get(this, _scriptsOnCreate).push(index_js_namespaceObject.visibilityScript);
|
|
156
|
+
await _class_private_method_get(this, _setupVisibilityTracking, setupVisibilityTracking).call(this);
|
|
157
|
+
}
|
|
158
|
+
await _class_private_method_get(this, _executeScriptsOnCreate, executeScriptsOnCreate).call(this);
|
|
159
|
+
if (_class_private_field_get(this, _options).userAgentInfo) await _class_private_field_get(this, _pptrPage).setUserAgent(_class_private_field_get(this, _options).userAgentInfo);
|
|
160
|
+
}
|
|
142
161
|
get tabId() {
|
|
143
162
|
return _class_private_field_get(this, _id);
|
|
144
163
|
}
|
|
@@ -149,11 +168,11 @@ class Tab extends external_eventemitter3_namespaceObject.EventEmitter {
|
|
|
149
168
|
return _class_private_field_get(this, _url);
|
|
150
169
|
}
|
|
151
170
|
async getTitle() {
|
|
152
|
-
|
|
171
|
+
_class_private_field_set(this, _title, await _class_private_method_get(this, _getTitle, getTitle).call(this));
|
|
153
172
|
return _class_private_field_get(this, _title);
|
|
154
173
|
}
|
|
155
174
|
async getFavicon() {
|
|
156
|
-
|
|
175
|
+
_class_private_field_set(this, _favicon, await _class_private_method_get(this, _getFavicon, getFavicon).call(this));
|
|
157
176
|
return _class_private_field_get(this, _favicon);
|
|
158
177
|
}
|
|
159
178
|
async _active() {
|
|
@@ -232,11 +251,9 @@ class Tab extends external_eventemitter3_namespaceObject.EventEmitter {
|
|
|
232
251
|
const validated = (0, external_utils_index_js_namespaceObject.validateNavigationUrl)(url);
|
|
233
252
|
if (validated.ignored) return {
|
|
234
253
|
success: false,
|
|
235
|
-
url: url,
|
|
254
|
+
url: validated.url,
|
|
236
255
|
message: validated.message
|
|
237
256
|
};
|
|
238
|
-
_class_private_field_set(this, _url, validated.url);
|
|
239
|
-
_class_private_field_set(this, _title, validated.url);
|
|
240
257
|
_class_private_method_get(this, _setLoading, setLoading).call(this, true);
|
|
241
258
|
try {
|
|
242
259
|
await _class_private_field_get(this, _pptrPage).setViewport({
|
|
@@ -248,20 +265,18 @@ class Tab extends external_eventemitter3_namespaceObject.EventEmitter {
|
|
|
248
265
|
waitUntil: options.waitUntil,
|
|
249
266
|
timeout: options.timeout
|
|
250
267
|
});
|
|
251
|
-
_class_private_field_set(this, _title, await _class_private_field_get(this, _pptrPage).title());
|
|
252
|
-
_class_private_field_set(this, _favicon, await _class_private_method_get(this, _getFavicon, getFavicon).call(this));
|
|
253
|
-
_class_private_method_get(this, _setLoading, setLoading).call(this, false);
|
|
254
268
|
return {
|
|
255
269
|
success: true,
|
|
256
|
-
url:
|
|
270
|
+
url: validated.url
|
|
257
271
|
};
|
|
258
272
|
} catch (error) {
|
|
259
|
-
_class_private_method_get(this, _setLoading, setLoading).call(this, false);
|
|
260
273
|
return {
|
|
261
274
|
success: false,
|
|
262
275
|
message: error instanceof Error ? error.message : String(error),
|
|
263
276
|
url: validated.url
|
|
264
277
|
};
|
|
278
|
+
} finally{
|
|
279
|
+
_class_private_method_get(this, _setLoading, setLoading).call(this, false);
|
|
265
280
|
}
|
|
266
281
|
}
|
|
267
282
|
async goBack(options = {}) {
|
|
@@ -401,7 +416,7 @@ class Tab extends external_eventemitter3_namespaceObject.EventEmitter {
|
|
|
401
416
|
else _class_private_field_get(this, _scriptsOnLoad).push(script);
|
|
402
417
|
}
|
|
403
418
|
constructor(page, options){
|
|
404
|
-
super(), _class_private_method_init(this, _onFrameNavigated), _class_private_method_init(this, _setupVisibilityTracking), _class_private_method_init(this, _executeScriptsOnCreate), _class_private_method_init(this, _executeScriptsOnLoad), _class_private_method_init(this, _getFavicon), _class_private_method_init(this, _setLoading), _class_private_field_init(this, _id, {
|
|
419
|
+
super(), _class_private_method_init(this, _onFrameNavigated), _class_private_method_init(this, _setupVisibilityTracking), _class_private_method_init(this, _executeScriptsOnCreate), _class_private_method_init(this, _executeScriptsOnLoad), _class_private_method_init(this, _getTitle), _class_private_method_init(this, _getFavicon), _class_private_method_init(this, _setLoading), _class_private_field_init(this, _id, {
|
|
405
420
|
writable: true,
|
|
406
421
|
value: void 0
|
|
407
422
|
}), _class_private_field_init(this, _options, {
|
|
@@ -440,8 +455,7 @@ class Tab extends external_eventemitter3_namespaceObject.EventEmitter {
|
|
|
440
455
|
}), _class_private_field_init(this, _scriptsOnCreate, {
|
|
441
456
|
writable: true,
|
|
442
457
|
value: [
|
|
443
|
-
index_js_namespaceObject.disableWebdriver
|
|
444
|
-
index_js_namespaceObject.visibilityScript
|
|
458
|
+
index_js_namespaceObject.disableWebdriver
|
|
445
459
|
]
|
|
446
460
|
}), _class_private_field_init(this, _scriptsOnLoad, {
|
|
447
461
|
writable: true,
|
|
@@ -484,9 +498,6 @@ class Tab extends external_eventemitter3_namespaceObject.EventEmitter {
|
|
|
484
498
|
_class_private_field_set(this, _tabDialog, new external_dialog_js_namespaceObject.TabDialog(this));
|
|
485
499
|
_class_private_field_set(this, _keyboard, new external_actions_index_js_namespaceObject.Keyboard(page, _class_private_field_get(this, _tabDialog), options.envInfo));
|
|
486
500
|
_class_private_field_set(this, _mouse, new external_actions_index_js_namespaceObject.Mouse(page, _class_private_field_get(this, _tabDialog)));
|
|
487
|
-
_class_private_method_get(this, _setupVisibilityTracking, setupVisibilityTracking).call(this);
|
|
488
|
-
_class_private_method_get(this, _executeScriptsOnCreate, executeScriptsOnCreate).call(this);
|
|
489
|
-
if (options.userAgentInfo) _class_private_field_get(this, _pptrPage).setUserAgent(options.userAgentInfo);
|
|
490
501
|
_class_private_field_get(this, _pptrPage).on('domcontentloaded', _class_private_field_get(this, _dclHandler));
|
|
491
502
|
_class_private_field_get(this, _pptrPage).on('load', _class_private_field_get(this, _loadHandler));
|
|
492
503
|
_class_private_field_get(this, _pptrPage).on('framenavigated', _class_private_field_get(this, _frameNavigatedHandler));
|
|
@@ -496,27 +507,11 @@ async function onFrameNavigated(frame) {
|
|
|
496
507
|
if (!frame.parentFrame()) {
|
|
497
508
|
const oldUrl = _class_private_field_get(this, _url);
|
|
498
509
|
const newUrl = frame.url();
|
|
499
|
-
const [title, favicon, historyData] = await Promise.all([
|
|
500
|
-
_class_private_field_get(this, _pptrPage).title().catch(()=>'Loading...'),
|
|
501
|
-
_class_private_method_get(this, _getFavicon, getFavicon).call(this).catch(()=>''),
|
|
502
|
-
this.getHistory().catch(()=>({
|
|
503
|
-
index: 0,
|
|
504
|
-
history: [],
|
|
505
|
-
canGoBack: false,
|
|
506
|
-
canGoForward: false
|
|
507
|
-
}))
|
|
508
|
-
]);
|
|
509
510
|
_class_private_field_set(this, _url, newUrl);
|
|
510
|
-
_class_private_field_set(this, _title, title);
|
|
511
|
-
_class_private_field_set(this, _favicon, favicon);
|
|
512
511
|
if (oldUrl !== newUrl) this.emit(external_types_index_js_namespaceObject.TabEvents.TabUrlChanged, {
|
|
513
512
|
tabId: _class_private_field_get(this, _id),
|
|
514
513
|
oldUrl: oldUrl,
|
|
515
|
-
newUrl: newUrl
|
|
516
|
-
title: title,
|
|
517
|
-
favicon: favicon,
|
|
518
|
-
canGoBack: historyData.canGoBack,
|
|
519
|
-
canGoForward: historyData.canGoForward
|
|
514
|
+
newUrl: newUrl
|
|
520
515
|
});
|
|
521
516
|
}
|
|
522
517
|
}
|
|
@@ -531,8 +526,10 @@ async function setupVisibilityTracking() {
|
|
|
531
526
|
async function executeScriptsOnCreate() {
|
|
532
527
|
try {
|
|
533
528
|
const script = (0, external_utils_index_js_namespaceObject.iife)(_class_private_field_get(this, _scriptsOnCreate).join('\n'));
|
|
534
|
-
await
|
|
535
|
-
|
|
529
|
+
await Promise.race([
|
|
530
|
+
_class_private_field_get(this, _pptrPage).evaluateOnNewDocument(script),
|
|
531
|
+
_class_private_field_get(this, _pptrPage).evaluate(script)
|
|
532
|
+
]);
|
|
536
533
|
} catch (error) {
|
|
537
534
|
console.warn("Failed to execute script on create:", error);
|
|
538
535
|
}
|
|
@@ -545,9 +542,26 @@ async function executeScriptsOnLoad() {
|
|
|
545
542
|
console.warn("Failed to execute script on load:", error);
|
|
546
543
|
}
|
|
547
544
|
}
|
|
545
|
+
async function getTitle() {
|
|
546
|
+
try {
|
|
547
|
+
await external_delay_default()(100);
|
|
548
|
+
const pptrTitle = (await _class_private_field_get(this, _pptrPage).title()).trim();
|
|
549
|
+
if (pptrTitle) return pptrTitle;
|
|
550
|
+
const domTitle = await _class_private_field_get(this, _pptrPage).evaluate(()=>{
|
|
551
|
+
var _titleElement_textContent;
|
|
552
|
+
const titleElement = document.querySelector('title');
|
|
553
|
+
return (null == titleElement ? void 0 : null == (_titleElement_textContent = titleElement.textContent) ? void 0 : _titleElement_textContent.trim()) || '';
|
|
554
|
+
});
|
|
555
|
+
if (domTitle) return domTitle;
|
|
556
|
+
return _class_private_field_get(this, _url);
|
|
557
|
+
} catch (error) {
|
|
558
|
+
return '';
|
|
559
|
+
}
|
|
560
|
+
}
|
|
548
561
|
async function getFavicon() {
|
|
549
562
|
if ('about:blank' === this.url || this.url.startsWith('chrome://')) return '';
|
|
550
563
|
try {
|
|
564
|
+
await external_delay_default()(100);
|
|
551
565
|
const favicon = await _class_private_field_get(this, _pptrPage).evaluate(()=>{
|
|
552
566
|
const iconLink = document.querySelector('link[rel*="icon"]');
|
|
553
567
|
if (iconLink && iconLink.href) return iconLink.href;
|
package/dist/tabs/tab.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs/tab.js","sources":["webpack://@agent-infra/browser/webpack/runtime/define_property_getters","webpack://@agent-infra/browser/webpack/runtime/has_own_property","webpack://@agent-infra/browser/webpack/runtime/make_namespace_object","webpack://@agent-infra/browser/./src/tabs/tab.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { EventEmitter } from 'eventemitter3';\nimport { BinaryImageParser, Base64ImageParser } from '@agent-infra/media-utils';\nimport { disableWebdriver, visibilityScript } from '../injected-script';\nimport { iife, Mutex, validateNavigationUrl } from '../utils';\nimport { TabDialog } from './dialog';\nimport { Mouse, Keyboard } from '../actions';\n\nimport type { Page, Frame, CDPSession } from 'puppeteer-core';\nimport {\n TabEvents,\n type NavigationOptions,\n type NavigationResult,\n type TabEventsMap,\n type TabOptions,\n type TabScreenshotOptions,\n type TabScreenshotResult,\n} from '../types';\n\nexport class Tab extends EventEmitter<TabEventsMap> {\n #id: string;\n #options: TabOptions;\n // eslint-disable-next-line no-unused-private-class-members\n #status: 'active' | 'inactive';\n\n #pptrPage: Page;\n\n #url = 'about:blank';\n #favicon = '';\n #title = '';\n\n #tabDialog: TabDialog;\n #keyboard: Keyboard;\n #mouse: Mouse;\n\n #isLoading = false;\n #reloadAbortController: AbortController | null = null;\n\n #scriptsOnCreate: string[] = [disableWebdriver, visibilityScript];\n #scriptsOnLoad: string[] = [];\n\n constructor(page: Page, options: TabOptions) {\n super();\n this.#pptrPage = page;\n this.#options = options;\n\n // CdpTarget has _targetId\n // @ts-ignore\n this.#id = options.tabId || page.target()._targetId; // tabId is tagetId\n this.#url = page.url();\n\n this.#status = 'active';\n this.#tabDialog = new TabDialog(this);\n this.#keyboard = new Keyboard(page, this.#tabDialog, options.envInfo);\n this.#mouse = new Mouse(page, this.#tabDialog);\n\n this.#setupVisibilityTracking();\n this.#executeScriptsOnCreate();\n\n // Set user agent if provided\n if (options.userAgentInfo) {\n this.#pptrPage.setUserAgent(options.userAgentInfo);\n }\n\n // page events: https://pptr.dev/api/puppeteer.pageevent\n this.#pptrPage.on('domcontentloaded', this.#dclHandler);\n this.#pptrPage.on('load', this.#loadHandler);\n this.#pptrPage.on('framenavigated', this.#frameNavigatedHandler);\n }\n\n // #region meta info\n\n get tabId() {\n return this.#id;\n }\n\n get page() {\n return this.#pptrPage;\n }\n\n get url() {\n return this.#url;\n }\n\n async getTitle() {\n if (!this.#title) {\n this.#title = await this.#pptrPage.title();\n }\n\n return this.#title;\n }\n\n async getFavicon() {\n if (!this.#favicon) {\n this.#favicon = await this.#getFavicon();\n }\n\n return this.#favicon;\n }\n\n // #endregion\n\n // #region events handler\n\n #dclHandler = () => {\n this.emit(TabEvents.TabLoadingStateChanged, {\n isLoading: true,\n tabId: this.#id,\n });\n };\n\n #loadHandler = () => {\n this.emit(TabEvents.TabLoadingStateChanged, {\n isLoading: false,\n tabId: this.#id,\n });\n this.#executeScriptsOnLoad();\n };\n\n #frameNavigatedHandler = (frame: Frame) => this.#onFrameNavigated(frame);\n\n // #endregion\n\n // #region active status\n\n /**\n * @internal\n */\n async _active() {\n await this.#pptrPage.bringToFront();\n this.#status = 'active';\n }\n\n /**\n * @internal\n */\n async _inactive() {\n this.#status = 'inactive';\n }\n\n /**\n * @internal\n */\n async _checkActiveStatusWithRuntime() {\n try {\n await this.#pptrPage.waitForFunction(\n () => document.visibilityState === 'visible',\n {\n timeout: 1000,\n },\n );\n return true;\n } catch (error) {\n return false;\n }\n }\n\n // #endregion\n\n // #region dialog/keyboard/mouse\n\n get dialog() {\n return this.#tabDialog;\n }\n\n get keyboard() {\n return this.#keyboard;\n }\n\n get mouse() {\n return this.#mouse;\n }\n\n // #endregion\n\n // #region screenshot\n\n async screenshot<T extends TabScreenshotOptions>(\n options: T = {} as T,\n ): Promise<TabScreenshotResult<T>> {\n if (options.path) {\n const binaryImage = await this.#pptrPage.screenshot({\n path: options.path,\n type: options.type,\n quality: options.quality,\n fullPage: options.fullPage,\n });\n const meta = new BinaryImageParser(binaryImage);\n\n return {\n data: binaryImage,\n type: meta.getImageType()!,\n width: meta.getDimensions()!.width,\n height: meta.getDimensions()!.height,\n } as TabScreenshotResult<T>;\n }\n\n const base64Image = await this.#pptrPage.screenshot({\n encoding: 'base64',\n type: options.type,\n quality: options.quality,\n fullPage: options.fullPage,\n });\n const meta = new Base64ImageParser(base64Image);\n\n return {\n data: base64Image,\n type: meta.getImageType()!,\n width: meta.getDimensions()!.width,\n height: meta.getDimensions()!.height,\n } as TabScreenshotResult<T>;\n }\n\n // #endregion\n\n // #region navigation\n\n async getHistory() {\n // @ts-ignore\n const history = await (this.#pptrPage._client() as CDPSession).send(\n 'Page.getNavigationHistory',\n );\n const index = history.currentIndex;\n const length = history.entries.length;\n\n const canGoBack = length > 1 && index !== 0;\n const canGoForward = length > 1 && index < length - 1;\n\n return {\n index: index,\n canGoBack: canGoBack,\n canGoForward: canGoForward,\n history: history.entries.map((item) => ({\n url: item.url,\n title: item.title,\n })),\n };\n }\n\n async goto(\n url: string,\n options: NavigationOptions = {},\n ): Promise<NavigationResult> {\n // validate / normalize url before navigation\n const validated = validateNavigationUrl(url);\n if (validated.ignored) {\n return {\n success: false,\n url: url,\n message: validated.message!,\n };\n }\n\n this.#url = validated.url;\n this.#title = validated.url;\n\n this.#setLoading(true);\n\n try {\n await this.#pptrPage.setViewport({\n width: this.#options.viewport.width,\n height: this.#options.viewport.height,\n deviceScaleFactor: this.#options.viewport.deviceScaleFactor,\n });\n await this.#pptrPage.goto(validated.url, {\n waitUntil: options.waitUntil,\n timeout: options.timeout,\n });\n\n this.#title = await this.#pptrPage.title();\n this.#favicon = await this.#getFavicon();\n\n this.#setLoading(false);\n\n return {\n success: true,\n url: this.#url,\n };\n } catch (error) {\n this.#setLoading(false);\n return {\n success: false,\n message: error instanceof Error ? error.message : String(error),\n url: validated.url,\n };\n }\n }\n\n #backMutex = new Mutex();\n async goBack(options: NavigationOptions = {}): Promise<NavigationResult> {\n using _ = await this.#backMutex.acquire();\n\n try {\n const { canGoBack } = await this.getHistory();\n\n if (!canGoBack) {\n return {\n success: false,\n url: this.#url,\n message: 'Cannot go back - no previous history entry',\n };\n }\n\n await this.#pptrPage.goBack({\n waitUntil: options.waitUntil,\n timeout: options.timeout,\n });\n\n return {\n success: true,\n url: this.#url,\n };\n } catch (error) {\n return {\n success: false,\n url: this.#url,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n #forwardMutex = new Mutex();\n async goForward(options: NavigationOptions = {}): Promise<NavigationResult> {\n using _ = await this.#forwardMutex.acquire();\n\n try {\n const { canGoForward } = await this.getHistory();\n\n if (!canGoForward) {\n return {\n success: false,\n url: this.#url,\n message: 'Cannot go forward - no next history entry',\n };\n }\n\n await this.#pptrPage.goForward({\n waitUntil: options.waitUntil,\n timeout: options.timeout,\n });\n\n return {\n success: true,\n url: this.#url,\n };\n } catch (error) {\n return {\n success: false,\n url: this.#url,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n #reloadMutex = new Mutex();\n async reload(options: NavigationOptions = {}): Promise<NavigationResult> {\n using _ = await this.#reloadMutex.acquire();\n\n if (this.#reloadAbortController) {\n this.#reloadAbortController.abort();\n }\n\n this.#reloadAbortController = new AbortController();\n this.#setLoading(true);\n\n try {\n await this.#pptrPage.reload({\n waitUntil: options.waitUntil,\n timeout: options.timeout,\n signal: this.#reloadAbortController.signal,\n });\n this.#setLoading(false);\n\n return {\n success: true,\n url: this.#url,\n };\n } catch (error) {\n this.#setLoading(false);\n\n return {\n success: false,\n url: this.#url,\n message: error instanceof Error ? error.message : String(error),\n };\n } finally {\n this.#reloadAbortController = null;\n }\n }\n\n /**\n * @internal\n */\n async _close() {\n this.#pptrPage.off('load', this.#loadHandler);\n this.#pptrPage.off('framenavigated', this.#frameNavigatedHandler);\n\n if (this.#reloadAbortController) {\n this.#reloadAbortController.abort();\n this.#reloadAbortController = null;\n }\n\n this.#tabDialog.cleanup();\n\n try {\n await this.#pptrPage.close();\n } catch (error) {\n // If the page has already been manually closed\n // (not controlled by pptr, usually upon receiving the 'targetdestroyed' event),\n // then it can be ignored directly.\n if (\n error instanceof Error &&\n error.message.includes('No target with given id found')\n ) {\n return;\n }\n\n throw error;\n }\n }\n\n async #onFrameNavigated(frame: Frame) {\n if (!frame.parentFrame()) {\n const oldUrl = this.#url;\n const newUrl = frame.url();\n const [title, favicon, historyData] = await Promise.all([\n this.#pptrPage.title().catch(() => 'Loading...'),\n this.#getFavicon().catch(() => ''),\n this.getHistory().catch(() => ({\n index: 0,\n history: [],\n canGoBack: false,\n canGoForward: false,\n })),\n ]);\n\n this.#url = newUrl;\n this.#title = title;\n this.#favicon = favicon;\n\n if (oldUrl !== newUrl) {\n this.emit(TabEvents.TabUrlChanged, {\n tabId: this.#id,\n oldUrl: oldUrl,\n newUrl: newUrl,\n title: title,\n favicon: favicon,\n canGoBack: historyData.canGoBack,\n canGoForward: historyData.canGoForward,\n });\n }\n }\n }\n\n // #endregion\n\n // #region injectScript\n\n injectScriptOnCreate(script: string | string[]) {\n if (Array.isArray(script)) {\n this.#scriptsOnCreate.push(...script);\n } else {\n this.#scriptsOnCreate.push(script);\n }\n }\n\n injectScriptOnLoad(script: string | string[]) {\n if (Array.isArray(script)) {\n this.#scriptsOnLoad.push(...script);\n } else {\n this.#scriptsOnLoad.push(script);\n }\n }\n\n async #setupVisibilityTracking() {\n await this.#pptrPage.exposeFunction(\n '__agent_infra_visibility_change',\n (isVisible: boolean) => {\n this.emit(TabEvents.TabVisibilityChanged, {\n tabId: this.#id,\n isVisible,\n });\n },\n );\n }\n\n async #executeScriptsOnCreate() {\n try {\n const script = iife(this.#scriptsOnCreate.join('\\n'));\n await this.#pptrPage.evaluateOnNewDocument(script);\n await this.#pptrPage.evaluate(script);\n } catch (error) {\n console.warn('Failed to execute script on create:', error);\n }\n }\n\n async #executeScriptsOnLoad(): Promise<void> {\n try {\n const script = iife(this.#scriptsOnLoad.join('\\n'));\n await this.#pptrPage.evaluate(script);\n } catch (error) {\n console.warn('Failed to execute script on load:', error);\n }\n }\n\n // #endregion\n\n async #getFavicon() {\n if (this.url === 'about:blank' || this.url.startsWith('chrome://')) {\n return '';\n }\n\n try {\n const favicon = await this.#pptrPage.evaluate(() => {\n const iconLink = document.querySelector(\n 'link[rel*=\"icon\"]',\n ) as HTMLLinkElement;\n if (iconLink && iconLink.href) {\n return iconLink.href;\n }\n\n // fallback\n if (\n window.location &&\n window.location.origin &&\n window.location.origin !== 'null' &&\n window.location.origin !== 'file://'\n ) {\n return `${window.location.origin}/favicon.ico`;\n }\n\n return '';\n });\n\n return favicon;\n } catch (error) {\n console.warn('Failed to get favicon:', error);\n return '';\n }\n }\n\n #setLoading(loading: boolean) {\n if (this.#isLoading === loading) {\n return;\n }\n\n // console.log('setLoading', loading, this.#url);\n\n this.#isLoading = loading;\n this.emit(TabEvents.TabLoadingStateChanged, {\n isLoading: loading,\n tabId: this.#id,\n });\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","_id","_options","_status","_pptrPage","_url","_favicon","_title","_tabDialog","_keyboard","_mouse","_isLoading","_reloadAbortController","_scriptsOnCreate","_scriptsOnLoad","_dclHandler","_loadHandler","_frameNavigatedHandler","_backMutex","_forwardMutex","_reloadMutex","_onFrameNavigated","_setupVisibilityTracking","_executeScriptsOnCreate","_executeScriptsOnLoad","_getFavicon","setLoading","Tab","EventEmitter","getFavicon","document","error","options","binaryImage","meta","BinaryImageParser","base64Image","Base64ImageParser","history","index","length","canGoBack","canGoForward","item","url","validated","validateNavigationUrl","Error","String","_","AbortController","script","Array","page","onFrameNavigated","setupVisibilityTracking","executeScriptsOnCreate","executeScriptsOnLoad","disableWebdriver","visibilityScript","TabEvents","frame","Mutex","TabDialog","Keyboard","Mouse","oldUrl","newUrl","title","favicon","historyData","Promise","isVisible","iife","console","iconLink","window","loading"],"mappings":";;;;;;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;ACHC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoBCI,MAAAA,WAAAA,GAAAA,IAAAA,WACAC,WAAAA,WAAAA,GAAAA,IAAAA,WAEAC,UAAAA,WAAAA,GAAAA,IAAAA,WAEAC,YAAAA,WAAAA,GAAAA,IAAAA,WAEAC,OAAAA,WAAAA,GAAAA,IAAAA,WACAC,WAAAA,WAAAA,GAAAA,IAAAA,WACAC,SAAAA,WAAAA,GAAAA,IAAAA,WAEAC,aAAAA,WAAAA,GAAAA,IAAAA,WACAC,YAAAA,WAAAA,GAAAA,IAAAA,WACAC,SAAAA,WAAAA,GAAAA,IAAAA,WAEAC,aAAAA,WAAAA,GAAAA,IAAAA,WACAC,yBAAAA,WAAAA,GAAAA,IAAAA,WAEAC,mBAAAA,WAAAA,GAAAA,IAAAA,WACAC,iBAAAA,WAAAA,GAAAA,IAAAA,WAiEAC,cAAAA,WAAAA,GAAAA,IAAAA,WAOAC,eAAAA,WAAAA,GAAAA,IAAAA,WAQAC,yBAAAA,WAAAA,GAAAA,IAAAA,WAyKAC,aAAAA,WAAAA,GAAAA,IAAAA,WAiCAC,gBAAAA,WAAAA,GAAAA,IAAAA,WAiCAC,eAAAA,WAAAA,GAAAA,IAAAA,WAmEMC,oBAAAA,WAAAA,GAAAA,IAAAA,WAqDAC,2BAAAA,WAAAA,GAAAA,IAAAA,WAYAC,0BAAAA,WAAAA,GAAAA,IAAAA,WAUAC,wBAAAA,WAAAA,GAAAA,IAAAA,WAWAC,cAAAA,WAAAA,GAAAA,IAAAA,WAkCNC,cAAAA,WAAAA,GAAAA,IAAAA;AA1gBK,MAAMC,YAAYC,uCAAAA,YAAYA;IAqDnC,IAAI,QAAQ;QACV,OAAO,6BAAI,EAAC3B;IACd;IAEA,IAAI,OAAO;QACT,OAAO,6BAAI,EAACG;IACd;IAEA,IAAI,MAAM;QACR,OAAO,6BAAI,EAACC;IACd;IAEA,MAAM,WAAW;QACf,IAAI,CAAC,6BAAI,EAACE,wCACHA,QAAS,MAAM,6BAAI,EAACH,WAAU,KAAK;QAG1C,OAAO,6BAAI,EAACG;IACd;IAEA,MAAM,aAAa;QACjB,IAAI,CAAC,6BAAI,EAACD,0CACHA,UAAW,MAAM,8BAAI,EAACuB,aAAAA,YAAAA,IAAAA,CAAL,IAAI;QAG5B,OAAO,6BAAI,EAACvB;IACd;IA8BA,MAAM,UAAU;QACd,MAAM,6BAAI,EAACF,WAAU,YAAY;uCAC5BD,SAAU;IACjB;IAKA,MAAM,YAAY;uCACXA,SAAU;IACjB;IAKA,MAAM,gCAAgC;QACpC,IAAI;YACF,MAAM,6BAAI,EAACC,WAAU,eAAe,CAClC,IAAM0B,AAA6B,cAA7BA,SAAS,eAAe,EAC9B;gBACE,SAAS;YACX;YAEF,OAAO;QACT,EAAE,OAAOC,OAAO;YACd,OAAO;QACT;IACF;IAMA,IAAI,SAAS;QACX,OAAO,6BAAI,EAACvB;IACd;IAEA,IAAI,WAAW;QACb,OAAO,6BAAI,EAACC;IACd;IAEA,IAAI,QAAQ;QACV,OAAO,6BAAI,EAACC;IACd;IAMA,MAAM,WACJsB,UAAa,CAAC,CAAM,EACa;QACjC,IAAIA,QAAQ,IAAI,EAAE;YAChB,MAAMC,cAAc,MAAM,6BAAI,EAAC7B,WAAU,UAAU,CAAC;gBAClD,MAAM4B,QAAQ,IAAI;gBAClB,MAAMA,QAAQ,IAAI;gBAClB,SAASA,QAAQ,OAAO;gBACxB,UAAUA,QAAQ,QAAQ;YAC5B;YACA,MAAME,OAAO,IAAIC,4BAAAA,iBAAiBA,CAACF;YAEnC,OAAO;gBACL,MAAMA;gBACN,MAAMC,KAAK,YAAY;gBACvB,OAAOA,KAAK,aAAa,GAAI,KAAK;gBAClC,QAAQA,KAAK,aAAa,GAAI,MAAM;YACtC;QACF;QAEA,MAAME,cAAc,MAAM,6BAAI,EAAChC,WAAU,UAAU,CAAC;YAClD,UAAU;YACV,MAAM4B,QAAQ,IAAI;YAClB,SAASA,QAAQ,OAAO;YACxB,UAAUA,QAAQ,QAAQ;QAC5B;QACA,MAAME,OAAO,IAAIG,4BAAAA,iBAAiBA,CAACD;QAEnC,OAAO;YACL,MAAMA;YACN,MAAMF,KAAK,YAAY;YACvB,OAAOA,KAAK,aAAa,GAAI,KAAK;YAClC,QAAQA,KAAK,aAAa,GAAI,MAAM;QACtC;IACF;IAMA,MAAM,aAAa;QAEjB,MAAMI,UAAU,MAAO,6BAAI,EAAClC,WAAU,OAAO,GAAkB,IAAI,CACjE;QAEF,MAAMmC,QAAQD,QAAQ,YAAY;QAClC,MAAME,SAASF,QAAQ,OAAO,CAAC,MAAM;QAErC,MAAMG,YAAYD,SAAS,KAAKD,AAAU,MAAVA;QAChC,MAAMG,eAAeF,SAAS,KAAKD,QAAQC,SAAS;QAEpD,OAAO;YACL,OAAOD;YACP,WAAWE;YACX,cAAcC;YACd,SAASJ,QAAQ,OAAO,CAAC,GAAG,CAAC,CAACK,OAAU;oBACtC,KAAKA,KAAK,GAAG;oBACb,OAAOA,KAAK,KAAK;gBACnB;QACF;IACF;IAEA,MAAM,KACJC,GAAW,EACXZ,UAA6B,CAAC,CAAC,EACJ;QAE3B,MAAMa,YAAYC,AAAAA,IAAAA,wCAAAA,qBAAAA,AAAAA,EAAsBF;QACxC,IAAIC,UAAU,OAAO,EACnB,OAAO;YACL,SAAS;YACT,KAAKD;YACL,SAASC,UAAU,OAAO;QAC5B;uCAGGxC,MAAOwC,UAAU,GAAG;uCACpBtC,QAASsC,UAAU,GAAG;QAE3B,8BAAI,EAACnB,aAAAA,YAAAA,IAAAA,CAAL,IAAI,EAAa;QAEjB,IAAI;YACF,MAAM,6BAAI,EAACtB,WAAU,WAAW,CAAC;gBAC/B,OAAO,6BAAI,EAACF,UAAS,QAAQ,CAAC,KAAK;gBACnC,QAAQ,6BAAI,EAACA,UAAS,QAAQ,CAAC,MAAM;gBACrC,mBAAmB,6BAAI,EAACA,UAAS,QAAQ,CAAC,iBAAiB;YAC7D;YACA,MAAM,6BAAI,EAACE,WAAU,IAAI,CAACyC,UAAU,GAAG,EAAE;gBACvC,WAAWb,QAAQ,SAAS;gBAC5B,SAASA,QAAQ,OAAO;YAC1B;2CAEKzB,QAAS,MAAM,6BAAI,EAACH,WAAU,KAAK;2CACnCE,UAAW,MAAM,8BAAI,EAACuB,aAAAA,YAAAA,IAAAA,CAAL,IAAI;YAE1B,8BAAI,EAACH,aAAAA,YAAAA,IAAAA,CAAL,IAAI,EAAa;YAEjB,OAAO;gBACL,SAAS;gBACT,KAAK,6BAAI,EAACrB;YACZ;QACF,EAAE,OAAO0B,OAAO;YACd,8BAAI,EAACL,aAAAA,YAAAA,IAAAA,CAAL,IAAI,EAAa;YACjB,OAAO;gBACL,SAAS;gBACT,SAASK,iBAAiBgB,QAAQhB,MAAM,OAAO,GAAGiB,OAAOjB;gBACzD,KAAKc,UAAU,GAAG;YACpB;QACF;IACF;IAGA,MAAM,OAAOb,UAA6B,CAAC,CAAC,EAA6B;;;;;;;YAC7D,4BAAJiB,KAAI,MAAM,6BAAI,EAAC/B,YAAW,OAAO;YAEvC,IAAI;gBACF,MAAM,EAAEuB,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU;gBAE3C,IAAI,CAACA,WACH,OAAO;oBACL,SAAS;oBACT,KAAK,6BAAI,EAACpC;oBACV,SAAS;gBACX;gBAGF,MAAM,6BAAI,EAACD,WAAU,MAAM,CAAC;oBAC1B,WAAW4B,QAAQ,SAAS;oBAC5B,SAASA,QAAQ,OAAO;gBAC1B;gBAEA,OAAO;oBACL,SAAS;oBACT,KAAK,6BAAI,EAAC3B;gBACZ;YACF,EAAE,OAAO0B,OAAO;gBACd,OAAO;oBACL,SAAS;oBACT,KAAK,6BAAI,EAAC1B;oBACV,SAAS0B,iBAAiBgB,QAAQhB,MAAM,OAAO,GAAGiB,OAAOjB;gBAC3D;YACF;;;;;;;IACF;IAGA,MAAM,UAAUC,UAA6B,CAAC,CAAC,EAA6B;;;;;;;YAChE,4BAAJiB,KAAI,MAAM,6BAAI,EAAC9B,eAAc,OAAO;YAE1C,IAAI;gBACF,MAAM,EAAEuB,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU;gBAE9C,IAAI,CAACA,cACH,OAAO;oBACL,SAAS;oBACT,KAAK,6BAAI,EAACrC;oBACV,SAAS;gBACX;gBAGF,MAAM,6BAAI,EAACD,WAAU,SAAS,CAAC;oBAC7B,WAAW4B,QAAQ,SAAS;oBAC5B,SAASA,QAAQ,OAAO;gBAC1B;gBAEA,OAAO;oBACL,SAAS;oBACT,KAAK,6BAAI,EAAC3B;gBACZ;YACF,EAAE,OAAO0B,OAAO;gBACd,OAAO;oBACL,SAAS;oBACT,KAAK,6BAAI,EAAC1B;oBACV,SAAS0B,iBAAiBgB,QAAQhB,MAAM,OAAO,GAAGiB,OAAOjB;gBAC3D;YACF;;;;;;;IACF;IAGA,MAAM,OAAOC,UAA6B,CAAC,CAAC,EAA6B;;;;;;;YAC7D,4BAAJiB,KAAI,MAAM,6BAAI,EAAC7B,cAAa,OAAO;YAEzC,IAAI,6BAAI,EAACR,yBACP,6BAAI,EAACA,wBAAuB,KAAK;2CAG9BA,wBAAyB,IAAIsC;YAClC,8BAAI,EAACxB,aAAAA,YAAAA,IAAAA,CAAL,IAAI,EAAa;YAEjB,IAAI;gBACF,MAAM,6BAAI,EAACtB,WAAU,MAAM,CAAC;oBAC1B,WAAW4B,QAAQ,SAAS;oBAC5B,SAASA,QAAQ,OAAO;oBACxB,QAAQ,6BAAI,EAACpB,wBAAuB,MAAM;gBAC5C;gBACA,8BAAI,EAACc,aAAAA,YAAAA,IAAAA,CAAL,IAAI,EAAa;gBAEjB,OAAO;oBACL,SAAS;oBACT,KAAK,6BAAI,EAACrB;gBACZ;YACF,EAAE,OAAO0B,OAAO;gBACd,8BAAI,EAACL,aAAAA,YAAAA,IAAAA,CAAL,IAAI,EAAa;gBAEjB,OAAO;oBACL,SAAS;oBACT,KAAK,6BAAI,EAACrB;oBACV,SAAS0B,iBAAiBgB,QAAQhB,MAAM,OAAO,GAAGiB,OAAOjB;gBAC3D;YACF,SAAU;+CACHnB,wBAAyB;YAChC;;;;;;;IACF;IAKA,MAAM,SAAS;QACb,6BAAI,EAACR,WAAU,GAAG,CAAC,QAAQ,6BAAI,EAACY;QAChC,6BAAI,EAACZ,WAAU,GAAG,CAAC,kBAAkB,6BAAI,EAACa;QAE1C,IAAI,6BAAI,EAACL,yBAAwB;YAC/B,6BAAI,EAACA,wBAAuB,KAAK;2CAC5BA,wBAAyB;QAChC;QAEA,6BAAI,EAACJ,YAAW,OAAO;QAEvB,IAAI;YACF,MAAM,6BAAI,EAACJ,WAAU,KAAK;QAC5B,EAAE,OAAO2B,OAAO;YAId,IACEA,iBAAiBgB,SACjBhB,MAAM,OAAO,CAAC,QAAQ,CAAC,kCAEvB;YAGF,MAAMA;QACR;IACF;IAuCA,qBAAqBoB,MAAyB,EAAE;QAC9C,IAAIC,MAAM,OAAO,CAACD,SAChB,6BAAI,EAACtC,kBAAiB,IAAI,IAAIsC;aAE9B,6BAAI,EAACtC,kBAAiB,IAAI,CAACsC;IAE/B;IAEA,mBAAmBA,MAAyB,EAAE;QAC5C,IAAIC,MAAM,OAAO,CAACD,SAChB,6BAAI,EAACrC,gBAAe,IAAI,IAAIqC;aAE5B,6BAAI,EAACrC,gBAAe,IAAI,CAACqC;IAE7B;IA/aA,YAAYE,IAAU,EAAErB,OAAmB,CAAE;QAC3C,KAAK,IA2XPsB,2BAAAA,IAAAA,EAAMjC,oBAqDNkC,2BAAAA,IAAAA,EAAMjC,2BAYNkC,2BAAAA,IAAAA,EAAMjC,0BAUNkC,2BAAAA,IAAAA,EAAMjC,wBAWNK,2BAAAA,IAAAA,EAAMJ,cAkCNC,2BAAAA,IAAAA,EAAAA,cAzgBAzB,0BAAAA,IAAAA,EAAAA,KAAAA;;mBAAAA,KAAAA;YACAC,0BAAAA,IAAAA,EAAAA,UAAAA;;mBAAAA,KAAAA;YAEAC,0BAAAA,IAAAA,EAAAA,SAAAA;;mBAAAA,KAAAA;YAEAC,0BAAAA,IAAAA,EAAAA,WAAAA;;mBAAAA,KAAAA;YAEAC,0BAAAA,IAAAA,EAAAA,MAAAA;;mBAAO;YACPC,0BAAAA,IAAAA,EAAAA,UAAAA;;mBAAW;YACXC,0BAAAA,IAAAA,EAAAA,QAAAA;;mBAAS;YAETC,0BAAAA,IAAAA,EAAAA,YAAAA;;mBAAAA,KAAAA;YACAC,0BAAAA,IAAAA,EAAAA,WAAAA;;mBAAAA,KAAAA;YACAC,0BAAAA,IAAAA,EAAAA,QAAAA;;mBAAAA,KAAAA;YAEAC,0BAAAA,IAAAA,EAAAA,YAAAA;;mBAAa;YACbC,0BAAAA,IAAAA,EAAAA,wBAAAA;;mBAAiD;YAEjDC,0BAAAA,IAAAA,EAAAA,kBAAAA;;mBAA6B;gBAAC6C,yBAAAA,gBAAgBA;gBAAEC,yBAAAA,gBAAgBA;aAAC;YACjE7C,0BAAAA,IAAAA,EAAAA,gBAAAA;;mBAA2B,EAAE;YAiE7BC,0BAAAA,IAAAA,EAAAA,aAAAA;;mBAAc;gBACZ,IAAI,CAAC,IAAI,CAAC6C,wCAAAA,SAAAA,CAAAA,sBAAgC,EAAE;oBAC1C,WAAW;oBACX,OAAO,6BAAI,EAAC3D;gBACd;YACF;YAEAe,0BAAAA,IAAAA,EAAAA,cAAAA;;mBAAe;gBACb,IAAI,CAAC,IAAI,CAAC4C,wCAAAA,SAAAA,CAAAA,sBAAgC,EAAE;oBAC1C,WAAW;oBACX,OAAO,6BAAI,EAAC3D;gBACd;gBACA,8BAAI,EAACwD,uBAAAA,sBAAAA,IAAAA,CAAL,IAAI;YACN;YAEAxC,0BAAAA,IAAAA,EAAAA,wBAAAA;;mBAAyB,CAAC4C,QAAiB,8BAAI,EAACP,mBAAAA,kBAAAA,IAAAA,CAAL,IAAI,EAAmBO;YAyKlE3C,0BAAAA,IAAAA,EAAAA,YAAAA;;mBAAa,IAAI4C,wCAAAA,KAAKA;YAiCtB3C,0BAAAA,IAAAA,EAAAA,eAAAA;;mBAAgB,IAAI2C,wCAAAA,KAAKA;YAiCzB1C,0BAAAA,IAAAA,EAAAA,cAAAA;;mBAAe,IAAI0C,wCAAAA,KAAKA;;uCAvTjB1D,WAAYiD;uCACZnD,UAAW8B;uCAIX/B,KAAM+B,QAAQ,KAAK,IAAIqB,KAAK,MAAM,GAAG,SAAS;uCAC9ChD,MAAOgD,KAAK,GAAG;uCAEflD,SAAU;uCACVK,YAAa,IAAIuD,mCAAAA,SAASA,CAAC,IAAI;uCAC/BtD,WAAY,IAAIuD,0CAAAA,QAAQA,CAACX,MAAM,6BAAI,EAAC7C,aAAYwB,QAAQ,OAAO;uCAC/DtB,QAAS,IAAIuD,0CAAAA,KAAKA,CAACZ,MAAM,6BAAI,EAAC7C;QAEnC,8BAAI,EAAC+C,0BAAAA,yBAAAA,IAAAA,CAAL,IAAI;QACJ,8BAAI,EAACC,yBAAAA,wBAAAA,IAAAA,CAAL,IAAI;QAGJ,IAAIxB,QAAQ,aAAa,EACvB,6BAAI,EAAC5B,WAAU,YAAY,CAAC4B,QAAQ,aAAa;QAInD,6BAAI,EAAC5B,WAAU,EAAE,CAAC,oBAAoB,6BAAI,EAACW;QAC3C,6BAAI,EAACX,WAAU,EAAE,CAAC,QAAQ,6BAAI,EAACY;QAC/B,6BAAI,EAACZ,WAAU,EAAE,CAAC,kBAAkB,6BAAI,EAACa;IAC3C;AAseF;AArIEqC,eAAAA,iBAAwBO,KAAY;IAClC,IAAI,CAACA,MAAM,WAAW,IAAI;QACxB,MAAMK,SAAS,6BAAI,EAAC7D;QACpB,MAAM8D,SAASN,MAAM,GAAG;QACxB,MAAM,CAACO,OAAOC,SAASC,YAAY,GAAG,MAAMC,QAAQ,GAAG,CAAC;YACtD,6BAAI,EAACnE,WAAU,KAAK,GAAG,KAAK,CAAC,IAAM;YACnC,8BAAI,EAACyB,aAAAA,YAAAA,IAAAA,CAAL,IAAI,EAAe,KAAK,CAAC,IAAM;YAC/B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,IAAO;oBAC7B,OAAO;oBACP,SAAS,EAAE;oBACX,WAAW;oBACX,cAAc;gBAChB;SACD;uCAEIxB,MAAO8D;uCACP5D,QAAS6D;uCACT9D,UAAW+D;QAEhB,IAAIH,WAAWC,QACb,IAAI,CAAC,IAAI,CAACP,wCAAAA,SAAAA,CAAAA,aAAuB,EAAE;YACjC,OAAO,6BAAI,EAAC3D;YACZ,QAAQiE;YACR,QAAQC;YACR,OAAOC;YACP,SAASC;YACT,WAAWC,YAAY,SAAS;YAChC,cAAcA,YAAY,YAAY;QACxC;IAEJ;AACF;AAsBAf,eAAAA;IACE,MAAM,6BAAI,EAACnD,WAAU,cAAc,CACjC,mCACA,CAACoE;QACC,IAAI,CAAC,IAAI,CAACZ,wCAAAA,SAAAA,CAAAA,oBAA8B,EAAE;YACxC,OAAO,6BAAI,EAAC3D;YACZuE;QACF;IACF;AAEJ;AAEAhB,eAAAA;IACE,IAAI;QACF,MAAML,SAASsB,AAAAA,IAAAA,wCAAAA,IAAAA,AAAAA,EAAK,6BAAI,EAAC5D,kBAAiB,IAAI,CAAC;QAC/C,MAAM,6BAAI,EAACT,WAAU,qBAAqB,CAAC+C;QAC3C,MAAM,6BAAI,EAAC/C,WAAU,QAAQ,CAAC+C;IAChC,EAAE,OAAOpB,OAAO;QACd2C,QAAQ,IAAI,CAAC,uCAAuC3C;IACtD;AACF;AAEA0B,eAAAA;IACE,IAAI;QACF,MAAMN,SAASsB,AAAAA,IAAAA,wCAAAA,IAAAA,AAAAA,EAAK,6BAAI,EAAC3D,gBAAe,IAAI,CAAC;QAC7C,MAAM,6BAAI,EAACV,WAAU,QAAQ,CAAC+C;IAChC,EAAE,OAAOpB,OAAO;QACd2C,QAAQ,IAAI,CAAC,qCAAqC3C;IACpD;AACF;AAIAF,eAAAA;IACE,IAAI,AAAa,kBAAb,IAAI,CAAC,GAAG,IAAsB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,cACpD,OAAO;IAGT,IAAI;QACF,MAAMwC,UAAU,MAAM,6BAAI,EAACjE,WAAU,QAAQ,CAAC;YAC5C,MAAMuE,WAAW7C,SAAS,aAAa,CACrC;YAEF,IAAI6C,YAAYA,SAAS,IAAI,EAC3B,OAAOA,SAAS,IAAI;YAItB,IACEC,OAAO,QAAQ,IACfA,OAAO,QAAQ,CAAC,MAAM,IACtBA,AAA2B,WAA3BA,OAAO,QAAQ,CAAC,MAAM,IACtBA,AAA2B,cAA3BA,OAAO,QAAQ,CAAC,MAAM,EAEtB,OAAO,GAAGA,OAAO,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC;YAGhD,OAAO;QACT;QAEA,OAAOP;IACT,EAAE,OAAOtC,OAAO;QACd2C,QAAQ,IAAI,CAAC,0BAA0B3C;QACvC,OAAO;IACT;AACF;AAEAL,SAAAA,WAAYmD,OAAgB;IAC1B,IAAI,6BAAI,EAAClE,gBAAekE,SACtB;mCAKGlE,YAAakE;IAClB,IAAI,CAAC,IAAI,CAACjB,wCAAAA,SAAAA,CAAAA,sBAAgC,EAAE;QAC1C,WAAWiB;QACX,OAAO,6BAAI,EAAC5E;IACd;AACF"}
|
|
1
|
+
{"version":3,"file":"tabs/tab.js","sources":["webpack://@agent-infra/browser/webpack/runtime/compat_get_default_export","webpack://@agent-infra/browser/webpack/runtime/define_property_getters","webpack://@agent-infra/browser/webpack/runtime/has_own_property","webpack://@agent-infra/browser/webpack/runtime/make_namespace_object","webpack://@agent-infra/browser/./src/tabs/tab.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport delay from 'delay';\nimport { EventEmitter } from 'eventemitter3';\nimport { BinaryImageParser, Base64ImageParser } from '@agent-infra/media-utils';\nimport { disableWebdriver, visibilityScript } from '../injected-script';\nimport { iife, Mutex, validateNavigationUrl } from '../utils';\nimport { TabDialog } from './dialog';\nimport { Mouse, Keyboard } from '../actions';\n\nimport type { Page, Frame, CDPSession } from 'puppeteer-core';\nimport {\n TabEvents,\n type NavigationOptions,\n type NavigationResult,\n type TabEventsMap,\n type TabOptions,\n type TabScreenshotOptions,\n type TabScreenshotResult,\n} from '../types';\n\nexport class Tab extends EventEmitter<TabEventsMap> {\n #id: string;\n #options: TabOptions;\n // eslint-disable-next-line no-unused-private-class-members\n #status: 'active' | 'inactive';\n\n #pptrPage: Page;\n\n #url = 'about:blank';\n #favicon = '';\n #title = '';\n\n #tabDialog: TabDialog;\n #keyboard: Keyboard;\n #mouse: Mouse;\n\n #isLoading = false;\n #reloadAbortController: AbortController | null = null;\n\n #scriptsOnCreate: string[] = [disableWebdriver];\n #scriptsOnLoad: string[] = [];\n\n constructor(page: Page, options: TabOptions) {\n super();\n this.#pptrPage = page;\n this.#options = options;\n\n // CdpTarget has _targetId\n // @ts-ignore\n this.#id = options.tabId || page.target()._targetId; // tabId is tagetId\n this.#url = page.url();\n\n this.#status = 'active';\n this.#tabDialog = new TabDialog(this);\n this.#keyboard = new Keyboard(page, this.#tabDialog, options.envInfo);\n this.#mouse = new Mouse(page, this.#tabDialog);\n\n // page events: https://pptr.dev/api/puppeteer.pageevent\n this.#pptrPage.on('domcontentloaded', this.#dclHandler);\n this.#pptrPage.on('load', this.#loadHandler);\n this.#pptrPage.on('framenavigated', this.#frameNavigatedHandler);\n }\n\n async init() {\n // Only setup visibility tracking if visibility script is injected\n if (this.#options.injectVisibilityScript) {\n this.#scriptsOnCreate.push(visibilityScript);\n await this.#setupVisibilityTracking();\n }\n\n await this.#executeScriptsOnCreate();\n\n if (this.#options.userAgentInfo) {\n await this.#pptrPage.setUserAgent(this.#options.userAgentInfo);\n }\n }\n\n // #region meta info\n\n get tabId() {\n return this.#id;\n }\n\n get page() {\n return this.#pptrPage;\n }\n\n get url() {\n return this.#url;\n }\n\n async getTitle() {\n this.#title = await this.#getTitle();\n\n return this.#title;\n }\n\n async getFavicon() {\n this.#favicon = await this.#getFavicon();\n\n return this.#favicon;\n }\n\n // #endregion\n\n // #region events handler\n\n #dclHandler = () => {\n this.emit(TabEvents.TabLoadingStateChanged, {\n isLoading: true,\n tabId: this.#id,\n });\n };\n\n #loadHandler = () => {\n this.emit(TabEvents.TabLoadingStateChanged, {\n isLoading: false,\n tabId: this.#id,\n });\n this.#executeScriptsOnLoad();\n };\n\n #frameNavigatedHandler = (frame: Frame) => this.#onFrameNavigated(frame);\n\n // #endregion\n\n // #region active status\n\n /**\n * @internal\n */\n async _active() {\n await this.#pptrPage.bringToFront();\n this.#status = 'active';\n }\n\n /**\n * @internal\n */\n async _inactive() {\n this.#status = 'inactive';\n }\n\n /**\n * @internal\n */\n async _checkActiveStatusWithRuntime() {\n try {\n await this.#pptrPage.waitForFunction(\n () => document.visibilityState === 'visible',\n {\n timeout: 1000,\n },\n );\n return true;\n } catch (error) {\n return false;\n }\n }\n\n // #endregion\n\n // #region dialog/keyboard/mouse\n\n get dialog() {\n return this.#tabDialog;\n }\n\n get keyboard() {\n return this.#keyboard;\n }\n\n get mouse() {\n return this.#mouse;\n }\n\n // #endregion\n\n // #region screenshot\n\n async screenshot<T extends TabScreenshotOptions>(\n options: T = {} as T,\n ): Promise<TabScreenshotResult<T>> {\n if (options.path) {\n const binaryImage = await this.#pptrPage.screenshot({\n path: options.path,\n type: options.type,\n quality: options.quality,\n fullPage: options.fullPage,\n });\n const meta = new BinaryImageParser(binaryImage);\n\n return {\n data: binaryImage,\n type: meta.getImageType()!,\n width: meta.getDimensions()!.width,\n height: meta.getDimensions()!.height,\n } as TabScreenshotResult<T>;\n }\n\n const base64Image = await this.#pptrPage.screenshot({\n encoding: 'base64',\n type: options.type,\n quality: options.quality,\n fullPage: options.fullPage,\n });\n const meta = new Base64ImageParser(base64Image);\n\n return {\n data: base64Image,\n type: meta.getImageType()!,\n width: meta.getDimensions()!.width,\n height: meta.getDimensions()!.height,\n } as TabScreenshotResult<T>;\n }\n\n // #endregion\n\n // #region navigation\n\n async getHistory() {\n // @ts-ignore\n const history = await (this.#pptrPage._client() as CDPSession).send(\n 'Page.getNavigationHistory',\n );\n const index = history.currentIndex;\n const length = history.entries.length;\n\n const canGoBack = length > 1 && index !== 0;\n const canGoForward = length > 1 && index < length - 1;\n\n return {\n index: index,\n canGoBack: canGoBack,\n canGoForward: canGoForward,\n history: history.entries.map((item) => ({\n url: item.url,\n title: item.title,\n })),\n };\n }\n\n async goto(\n url: string,\n options: NavigationOptions = {},\n ): Promise<NavigationResult> {\n // validate / normalize url before navigation\n const validated = validateNavigationUrl(url);\n if (validated.ignored) {\n return {\n success: false,\n url: validated.url,\n message: validated.message!,\n };\n }\n\n this.#setLoading(true);\n\n try {\n await this.#pptrPage.setViewport({\n width: this.#options.viewport.width,\n height: this.#options.viewport.height,\n deviceScaleFactor: this.#options.viewport.deviceScaleFactor,\n });\n await this.#pptrPage.goto(validated.url, {\n waitUntil: options.waitUntil,\n timeout: options.timeout,\n });\n\n return {\n success: true,\n url: validated.url,\n };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : String(error),\n url: validated.url,\n };\n } finally {\n this.#setLoading(false);\n }\n }\n\n #backMutex = new Mutex();\n async goBack(options: NavigationOptions = {}): Promise<NavigationResult> {\n using _ = await this.#backMutex.acquire();\n\n try {\n const { canGoBack } = await this.getHistory();\n\n if (!canGoBack) {\n return {\n success: false,\n url: this.#url,\n message: 'Cannot go back - no previous history entry',\n };\n }\n\n await this.#pptrPage.goBack({\n waitUntil: options.waitUntil,\n timeout: options.timeout,\n });\n\n return {\n success: true,\n url: this.#url,\n };\n } catch (error) {\n return {\n success: false,\n url: this.#url,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n #forwardMutex = new Mutex();\n async goForward(options: NavigationOptions = {}): Promise<NavigationResult> {\n using _ = await this.#forwardMutex.acquire();\n\n try {\n const { canGoForward } = await this.getHistory();\n\n if (!canGoForward) {\n return {\n success: false,\n url: this.#url,\n message: 'Cannot go forward - no next history entry',\n };\n }\n\n await this.#pptrPage.goForward({\n waitUntil: options.waitUntil,\n timeout: options.timeout,\n });\n\n return {\n success: true,\n url: this.#url,\n };\n } catch (error) {\n return {\n success: false,\n url: this.#url,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n #reloadMutex = new Mutex();\n async reload(options: NavigationOptions = {}): Promise<NavigationResult> {\n using _ = await this.#reloadMutex.acquire();\n\n if (this.#reloadAbortController) {\n this.#reloadAbortController.abort();\n }\n\n this.#reloadAbortController = new AbortController();\n this.#setLoading(true);\n\n try {\n await this.#pptrPage.reload({\n waitUntil: options.waitUntil,\n timeout: options.timeout,\n signal: this.#reloadAbortController.signal,\n });\n this.#setLoading(false);\n\n return {\n success: true,\n url: this.#url,\n };\n } catch (error) {\n this.#setLoading(false);\n\n return {\n success: false,\n url: this.#url,\n message: error instanceof Error ? error.message : String(error),\n };\n } finally {\n this.#reloadAbortController = null;\n }\n }\n\n /**\n * @internal\n */\n async _close() {\n this.#pptrPage.off('load', this.#loadHandler);\n this.#pptrPage.off('framenavigated', this.#frameNavigatedHandler);\n\n if (this.#reloadAbortController) {\n this.#reloadAbortController.abort();\n this.#reloadAbortController = null;\n }\n\n this.#tabDialog.cleanup();\n\n try {\n await this.#pptrPage.close();\n } catch (error) {\n // If the page has already been manually closed\n // (not controlled by pptr, usually upon receiving the 'targetdestroyed' event),\n // then it can be ignored directly.\n if (\n error instanceof Error &&\n error.message.includes('No target with given id found')\n ) {\n return;\n }\n\n throw error;\n }\n }\n\n async #onFrameNavigated(frame: Frame) {\n if (!frame.parentFrame()) {\n const oldUrl = this.#url;\n const newUrl = frame.url();\n\n this.#url = newUrl;\n\n if (oldUrl !== newUrl) {\n this.emit(TabEvents.TabUrlChanged, {\n tabId: this.#id,\n oldUrl: oldUrl,\n newUrl: newUrl,\n });\n }\n }\n }\n\n // #endregion\n\n // #region injectScript\n\n injectScriptOnCreate(script: string | string[]) {\n if (Array.isArray(script)) {\n this.#scriptsOnCreate.push(...script);\n } else {\n this.#scriptsOnCreate.push(script);\n }\n }\n\n injectScriptOnLoad(script: string | string[]) {\n if (Array.isArray(script)) {\n this.#scriptsOnLoad.push(...script);\n } else {\n this.#scriptsOnLoad.push(script);\n }\n }\n\n async #setupVisibilityTracking() {\n await this.#pptrPage.exposeFunction(\n '__agent_infra_visibility_change',\n (isVisible: boolean) => {\n this.emit(TabEvents.TabVisibilityChanged, {\n tabId: this.#id,\n isVisible,\n });\n },\n );\n }\n\n async #executeScriptsOnCreate() {\n try {\n const script = iife(this.#scriptsOnCreate.join('\\n'));\n await Promise.race([\n this.#pptrPage.evaluateOnNewDocument(script),\n this.#pptrPage.evaluate(script),\n ]);\n } catch (error) {\n console.warn('Failed to execute script on create:', error);\n }\n }\n\n async #executeScriptsOnLoad(): Promise<void> {\n try {\n const script = iife(this.#scriptsOnLoad.join('\\n'));\n await this.#pptrPage.evaluate(script);\n } catch (error) {\n console.warn('Failed to execute script on load:', error);\n }\n }\n\n // #endregion\n\n // #region private methods\n\n async #getTitle() {\n try {\n await delay(100);\n const pptrTitle = (await this.#pptrPage.title()).trim();\n if (pptrTitle) {\n return pptrTitle;\n }\n\n const domTitle = await this.#pptrPage.evaluate(() => {\n const titleElement = document.querySelector('title');\n return titleElement?.textContent?.trim() || '';\n });\n if (domTitle) {\n return domTitle;\n }\n\n return this.#url;\n } catch (error) {\n return '';\n }\n }\n\n async #getFavicon() {\n if (this.url === 'about:blank' || this.url.startsWith('chrome://')) {\n return '';\n }\n\n try {\n await delay(100);\n const favicon = await this.#pptrPage.evaluate(() => {\n const iconLink = document.querySelector(\n 'link[rel*=\"icon\"]',\n ) as HTMLLinkElement;\n if (iconLink && iconLink.href) {\n return iconLink.href;\n }\n\n // fallback\n if (\n window.location &&\n window.location.origin &&\n window.location.origin !== 'null' &&\n window.location.origin !== 'file://'\n ) {\n return `${window.location.origin}/favicon.ico`;\n }\n\n return '';\n });\n\n return favicon;\n } catch (error) {\n console.warn('Failed to get favicon:', error);\n return '';\n }\n }\n\n #setLoading(loading: boolean) {\n if (this.#isLoading === loading) {\n return;\n }\n\n // console.log('setLoading', loading, this.#url);\n\n this.#isLoading = loading;\n this.emit(TabEvents.TabLoadingStateChanged, {\n isLoading: loading,\n tabId: this.#id,\n });\n }\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","_id","_options","_status","_pptrPage","_url","_favicon","_title","_tabDialog","_keyboard","_mouse","_isLoading","_reloadAbortController","_scriptsOnCreate","_scriptsOnLoad","_dclHandler","_loadHandler","_frameNavigatedHandler","_backMutex","_forwardMutex","_reloadMutex","_onFrameNavigated","_setupVisibilityTracking","_executeScriptsOnCreate","_executeScriptsOnLoad","_getTitle","_getFavicon","setLoading","Tab","EventEmitter","visibilityScript","setupVisibilityTracking","executeScriptsOnCreate","getTitle","getFavicon","document","error","options","binaryImage","meta","BinaryImageParser","base64Image","Base64ImageParser","history","index","length","canGoBack","canGoForward","item","url","validated","validateNavigationUrl","Error","String","_","AbortController","script","Array","page","onFrameNavigated","executeScriptsOnLoad","disableWebdriver","TabEvents","frame","Mutex","TabDialog","Keyboard","Mouse","oldUrl","newUrl","isVisible","iife","Promise","console","delay","pptrTitle","domTitle","_titleElement_textContent","titleElement","favicon","iconLink","window","loading"],"mappings":"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"}
|
package/dist/tabs/tab.mjs
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Copyright (c) 2025 Bytedance, Inc. and its affiliates.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
|
+
import delay from "delay";
|
|
5
6
|
import { EventEmitter } from "eventemitter3";
|
|
6
7
|
import { Base64ImageParser, BinaryImageParser } from "@agent-infra/media-utils";
|
|
7
8
|
import { disableWebdriver, visibilityScript } from "../injected-script/index.mjs";
|
|
@@ -109,8 +110,16 @@ function tab_ts_dispose_resources(env) {
|
|
|
109
110
|
return next();
|
|
110
111
|
})(env);
|
|
111
112
|
}
|
|
112
|
-
var _id = /*#__PURE__*/ new WeakMap(), _options = /*#__PURE__*/ new WeakMap(), _status = /*#__PURE__*/ new WeakMap(), _pptrPage = /*#__PURE__*/ new WeakMap(), _url = /*#__PURE__*/ new WeakMap(), _favicon = /*#__PURE__*/ new WeakMap(), _title = /*#__PURE__*/ new WeakMap(), _tabDialog = /*#__PURE__*/ new WeakMap(), _keyboard = /*#__PURE__*/ new WeakMap(), _mouse = /*#__PURE__*/ new WeakMap(), _isLoading = /*#__PURE__*/ new WeakMap(), _reloadAbortController = /*#__PURE__*/ new WeakMap(), _scriptsOnCreate = /*#__PURE__*/ new WeakMap(), _scriptsOnLoad = /*#__PURE__*/ new WeakMap(), _dclHandler = /*#__PURE__*/ new WeakMap(), _loadHandler = /*#__PURE__*/ new WeakMap(), _frameNavigatedHandler = /*#__PURE__*/ new WeakMap(), _backMutex = /*#__PURE__*/ new WeakMap(), _forwardMutex = /*#__PURE__*/ new WeakMap(), _reloadMutex = /*#__PURE__*/ new WeakMap(), _onFrameNavigated = /*#__PURE__*/ new WeakSet(), _setupVisibilityTracking = /*#__PURE__*/ new WeakSet(), _executeScriptsOnCreate = /*#__PURE__*/ new WeakSet(), _executeScriptsOnLoad = /*#__PURE__*/ new WeakSet(), _getFavicon = /*#__PURE__*/ new WeakSet(), _setLoading = /*#__PURE__*/ new WeakSet();
|
|
113
|
+
var _id = /*#__PURE__*/ new WeakMap(), _options = /*#__PURE__*/ new WeakMap(), _status = /*#__PURE__*/ new WeakMap(), _pptrPage = /*#__PURE__*/ new WeakMap(), _url = /*#__PURE__*/ new WeakMap(), _favicon = /*#__PURE__*/ new WeakMap(), _title = /*#__PURE__*/ new WeakMap(), _tabDialog = /*#__PURE__*/ new WeakMap(), _keyboard = /*#__PURE__*/ new WeakMap(), _mouse = /*#__PURE__*/ new WeakMap(), _isLoading = /*#__PURE__*/ new WeakMap(), _reloadAbortController = /*#__PURE__*/ new WeakMap(), _scriptsOnCreate = /*#__PURE__*/ new WeakMap(), _scriptsOnLoad = /*#__PURE__*/ new WeakMap(), _dclHandler = /*#__PURE__*/ new WeakMap(), _loadHandler = /*#__PURE__*/ new WeakMap(), _frameNavigatedHandler = /*#__PURE__*/ new WeakMap(), _backMutex = /*#__PURE__*/ new WeakMap(), _forwardMutex = /*#__PURE__*/ new WeakMap(), _reloadMutex = /*#__PURE__*/ new WeakMap(), _onFrameNavigated = /*#__PURE__*/ new WeakSet(), _setupVisibilityTracking = /*#__PURE__*/ new WeakSet(), _executeScriptsOnCreate = /*#__PURE__*/ new WeakSet(), _executeScriptsOnLoad = /*#__PURE__*/ new WeakSet(), _getTitle = /*#__PURE__*/ new WeakSet(), _getFavicon = /*#__PURE__*/ new WeakSet(), _setLoading = /*#__PURE__*/ new WeakSet();
|
|
113
114
|
class Tab extends EventEmitter {
|
|
115
|
+
async init() {
|
|
116
|
+
if (_class_private_field_get(this, _options).injectVisibilityScript) {
|
|
117
|
+
_class_private_field_get(this, _scriptsOnCreate).push(visibilityScript);
|
|
118
|
+
await _class_private_method_get(this, _setupVisibilityTracking, setupVisibilityTracking).call(this);
|
|
119
|
+
}
|
|
120
|
+
await _class_private_method_get(this, _executeScriptsOnCreate, executeScriptsOnCreate).call(this);
|
|
121
|
+
if (_class_private_field_get(this, _options).userAgentInfo) await _class_private_field_get(this, _pptrPage).setUserAgent(_class_private_field_get(this, _options).userAgentInfo);
|
|
122
|
+
}
|
|
114
123
|
get tabId() {
|
|
115
124
|
return _class_private_field_get(this, _id);
|
|
116
125
|
}
|
|
@@ -121,11 +130,11 @@ class Tab extends EventEmitter {
|
|
|
121
130
|
return _class_private_field_get(this, _url);
|
|
122
131
|
}
|
|
123
132
|
async getTitle() {
|
|
124
|
-
|
|
133
|
+
_class_private_field_set(this, _title, await _class_private_method_get(this, _getTitle, getTitle).call(this));
|
|
125
134
|
return _class_private_field_get(this, _title);
|
|
126
135
|
}
|
|
127
136
|
async getFavicon() {
|
|
128
|
-
|
|
137
|
+
_class_private_field_set(this, _favicon, await _class_private_method_get(this, _getFavicon, getFavicon).call(this));
|
|
129
138
|
return _class_private_field_get(this, _favicon);
|
|
130
139
|
}
|
|
131
140
|
async _active() {
|
|
@@ -204,11 +213,9 @@ class Tab extends EventEmitter {
|
|
|
204
213
|
const validated = validateNavigationUrl(url);
|
|
205
214
|
if (validated.ignored) return {
|
|
206
215
|
success: false,
|
|
207
|
-
url: url,
|
|
216
|
+
url: validated.url,
|
|
208
217
|
message: validated.message
|
|
209
218
|
};
|
|
210
|
-
_class_private_field_set(this, _url, validated.url);
|
|
211
|
-
_class_private_field_set(this, _title, validated.url);
|
|
212
219
|
_class_private_method_get(this, _setLoading, setLoading).call(this, true);
|
|
213
220
|
try {
|
|
214
221
|
await _class_private_field_get(this, _pptrPage).setViewport({
|
|
@@ -220,20 +227,18 @@ class Tab extends EventEmitter {
|
|
|
220
227
|
waitUntil: options.waitUntil,
|
|
221
228
|
timeout: options.timeout
|
|
222
229
|
});
|
|
223
|
-
_class_private_field_set(this, _title, await _class_private_field_get(this, _pptrPage).title());
|
|
224
|
-
_class_private_field_set(this, _favicon, await _class_private_method_get(this, _getFavicon, getFavicon).call(this));
|
|
225
|
-
_class_private_method_get(this, _setLoading, setLoading).call(this, false);
|
|
226
230
|
return {
|
|
227
231
|
success: true,
|
|
228
|
-
url:
|
|
232
|
+
url: validated.url
|
|
229
233
|
};
|
|
230
234
|
} catch (error) {
|
|
231
|
-
_class_private_method_get(this, _setLoading, setLoading).call(this, false);
|
|
232
235
|
return {
|
|
233
236
|
success: false,
|
|
234
237
|
message: error instanceof Error ? error.message : String(error),
|
|
235
238
|
url: validated.url
|
|
236
239
|
};
|
|
240
|
+
} finally{
|
|
241
|
+
_class_private_method_get(this, _setLoading, setLoading).call(this, false);
|
|
237
242
|
}
|
|
238
243
|
}
|
|
239
244
|
async goBack(options = {}) {
|
|
@@ -373,7 +378,7 @@ class Tab extends EventEmitter {
|
|
|
373
378
|
else _class_private_field_get(this, _scriptsOnLoad).push(script);
|
|
374
379
|
}
|
|
375
380
|
constructor(page, options){
|
|
376
|
-
super(), _class_private_method_init(this, _onFrameNavigated), _class_private_method_init(this, _setupVisibilityTracking), _class_private_method_init(this, _executeScriptsOnCreate), _class_private_method_init(this, _executeScriptsOnLoad), _class_private_method_init(this, _getFavicon), _class_private_method_init(this, _setLoading), _class_private_field_init(this, _id, {
|
|
381
|
+
super(), _class_private_method_init(this, _onFrameNavigated), _class_private_method_init(this, _setupVisibilityTracking), _class_private_method_init(this, _executeScriptsOnCreate), _class_private_method_init(this, _executeScriptsOnLoad), _class_private_method_init(this, _getTitle), _class_private_method_init(this, _getFavicon), _class_private_method_init(this, _setLoading), _class_private_field_init(this, _id, {
|
|
377
382
|
writable: true,
|
|
378
383
|
value: void 0
|
|
379
384
|
}), _class_private_field_init(this, _options, {
|
|
@@ -412,8 +417,7 @@ class Tab extends EventEmitter {
|
|
|
412
417
|
}), _class_private_field_init(this, _scriptsOnCreate, {
|
|
413
418
|
writable: true,
|
|
414
419
|
value: [
|
|
415
|
-
disableWebdriver
|
|
416
|
-
visibilityScript
|
|
420
|
+
disableWebdriver
|
|
417
421
|
]
|
|
418
422
|
}), _class_private_field_init(this, _scriptsOnLoad, {
|
|
419
423
|
writable: true,
|
|
@@ -456,9 +460,6 @@ class Tab extends EventEmitter {
|
|
|
456
460
|
_class_private_field_set(this, _tabDialog, new TabDialog(this));
|
|
457
461
|
_class_private_field_set(this, _keyboard, new Keyboard(page, _class_private_field_get(this, _tabDialog), options.envInfo));
|
|
458
462
|
_class_private_field_set(this, _mouse, new Mouse(page, _class_private_field_get(this, _tabDialog)));
|
|
459
|
-
_class_private_method_get(this, _setupVisibilityTracking, setupVisibilityTracking).call(this);
|
|
460
|
-
_class_private_method_get(this, _executeScriptsOnCreate, executeScriptsOnCreate).call(this);
|
|
461
|
-
if (options.userAgentInfo) _class_private_field_get(this, _pptrPage).setUserAgent(options.userAgentInfo);
|
|
462
463
|
_class_private_field_get(this, _pptrPage).on('domcontentloaded', _class_private_field_get(this, _dclHandler));
|
|
463
464
|
_class_private_field_get(this, _pptrPage).on('load', _class_private_field_get(this, _loadHandler));
|
|
464
465
|
_class_private_field_get(this, _pptrPage).on('framenavigated', _class_private_field_get(this, _frameNavigatedHandler));
|
|
@@ -468,27 +469,11 @@ async function onFrameNavigated(frame) {
|
|
|
468
469
|
if (!frame.parentFrame()) {
|
|
469
470
|
const oldUrl = _class_private_field_get(this, _url);
|
|
470
471
|
const newUrl = frame.url();
|
|
471
|
-
const [title, favicon, historyData] = await Promise.all([
|
|
472
|
-
_class_private_field_get(this, _pptrPage).title().catch(()=>'Loading...'),
|
|
473
|
-
_class_private_method_get(this, _getFavicon, getFavicon).call(this).catch(()=>''),
|
|
474
|
-
this.getHistory().catch(()=>({
|
|
475
|
-
index: 0,
|
|
476
|
-
history: [],
|
|
477
|
-
canGoBack: false,
|
|
478
|
-
canGoForward: false
|
|
479
|
-
}))
|
|
480
|
-
]);
|
|
481
472
|
_class_private_field_set(this, _url, newUrl);
|
|
482
|
-
_class_private_field_set(this, _title, title);
|
|
483
|
-
_class_private_field_set(this, _favicon, favicon);
|
|
484
473
|
if (oldUrl !== newUrl) this.emit(TabEvents.TabUrlChanged, {
|
|
485
474
|
tabId: _class_private_field_get(this, _id),
|
|
486
475
|
oldUrl: oldUrl,
|
|
487
|
-
newUrl: newUrl
|
|
488
|
-
title: title,
|
|
489
|
-
favicon: favicon,
|
|
490
|
-
canGoBack: historyData.canGoBack,
|
|
491
|
-
canGoForward: historyData.canGoForward
|
|
476
|
+
newUrl: newUrl
|
|
492
477
|
});
|
|
493
478
|
}
|
|
494
479
|
}
|
|
@@ -503,8 +488,10 @@ async function setupVisibilityTracking() {
|
|
|
503
488
|
async function executeScriptsOnCreate() {
|
|
504
489
|
try {
|
|
505
490
|
const script = iife(_class_private_field_get(this, _scriptsOnCreate).join('\n'));
|
|
506
|
-
await
|
|
507
|
-
|
|
491
|
+
await Promise.race([
|
|
492
|
+
_class_private_field_get(this, _pptrPage).evaluateOnNewDocument(script),
|
|
493
|
+
_class_private_field_get(this, _pptrPage).evaluate(script)
|
|
494
|
+
]);
|
|
508
495
|
} catch (error) {
|
|
509
496
|
console.warn("Failed to execute script on create:", error);
|
|
510
497
|
}
|
|
@@ -517,9 +504,26 @@ async function executeScriptsOnLoad() {
|
|
|
517
504
|
console.warn("Failed to execute script on load:", error);
|
|
518
505
|
}
|
|
519
506
|
}
|
|
507
|
+
async function getTitle() {
|
|
508
|
+
try {
|
|
509
|
+
await delay(100);
|
|
510
|
+
const pptrTitle = (await _class_private_field_get(this, _pptrPage).title()).trim();
|
|
511
|
+
if (pptrTitle) return pptrTitle;
|
|
512
|
+
const domTitle = await _class_private_field_get(this, _pptrPage).evaluate(()=>{
|
|
513
|
+
var _titleElement_textContent;
|
|
514
|
+
const titleElement = document.querySelector('title');
|
|
515
|
+
return (null == titleElement ? void 0 : null == (_titleElement_textContent = titleElement.textContent) ? void 0 : _titleElement_textContent.trim()) || '';
|
|
516
|
+
});
|
|
517
|
+
if (domTitle) return domTitle;
|
|
518
|
+
return _class_private_field_get(this, _url);
|
|
519
|
+
} catch (error) {
|
|
520
|
+
return '';
|
|
521
|
+
}
|
|
522
|
+
}
|
|
520
523
|
async function getFavicon() {
|
|
521
524
|
if ('about:blank' === this.url || this.url.startsWith('chrome://')) return '';
|
|
522
525
|
try {
|
|
526
|
+
await delay(100);
|
|
523
527
|
const favicon = await _class_private_field_get(this, _pptrPage).evaluate(()=>{
|
|
524
528
|
const iconLink = document.querySelector('link[rel*="icon"]');
|
|
525
529
|
if (iconLink && iconLink.href) return iconLink.href;
|