@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.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs/tab.mjs","sources":["webpack://@agent-infra/browser/./src/tabs/tab.ts"],"sourcesContent":["/*\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":["_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":"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"}
|
|
1
|
+
{"version":3,"file":"tabs/tab.mjs","sources":["webpack://@agent-infra/browser/./src/tabs/tab.ts"],"sourcesContent":["/*\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":["_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/tabs.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export declare class Tabs<T extends Tab = Tab> {
|
|
|
8
8
|
constructor(browser: Browser, options: TabsOptions);
|
|
9
9
|
subscribe(callback: () => void): () => void;
|
|
10
10
|
getSnapshot(): TabsState;
|
|
11
|
-
protected createTabInstance(page: Page, options: TabOptions): T
|
|
11
|
+
protected createTabInstance(page: Page, options: TabOptions): Promise<T>;
|
|
12
12
|
protected initializeExistingTabs(): Promise<void>;
|
|
13
13
|
createTab(): Promise<string>;
|
|
14
14
|
activeTab(tabId: string): Promise<boolean>;
|
package/dist/tabs/tabs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/tabs/tabs.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAG5B,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAU,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,SAAS,EAEd,KAAK,WAAW,EAEjB,MAAM,eAAe,CAAC;AAEvB,qBAAa,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG;;IAO5B,KAAK,EAAE,SAAS,CAAC;WAGX,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW;gBAM9C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW;IAwBlD,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAI3C,WAAW,IAAI,SAAS;
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/tabs/tabs.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAG5B,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAU,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,SAAS,EAEd,KAAK,WAAW,EAEjB,MAAM,eAAe,CAAC;AAEvB,qBAAa,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG;;IAO5B,KAAK,EAAE,SAAS,CAAC;WAGX,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW;gBAM9C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW;IAwBlD,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAI3C,WAAW,IAAI,SAAS;cAOR,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,CAAC,CAAC;cASG,sBAAsB;IAkFhC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IA0D5B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMhD,YAAY,IAAI,CAAC,GAAG,IAAI;IAkDlB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ/C,aAAa,IAAI,MAAM;IAKvB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAqG/B"}
|
package/dist/tabs/tabs.js
CHANGED
|
@@ -161,8 +161,10 @@ class Tabs {
|
|
|
161
161
|
activeTabId: this.state.activeTabId
|
|
162
162
|
};
|
|
163
163
|
}
|
|
164
|
-
createTabInstance(page, options) {
|
|
165
|
-
|
|
164
|
+
async createTabInstance(page, options) {
|
|
165
|
+
const tab = new external_tab_js_namespaceObject.Tab(page, options);
|
|
166
|
+
await tab.init();
|
|
167
|
+
return tab;
|
|
166
168
|
}
|
|
167
169
|
async initializeExistingTabs() {
|
|
168
170
|
var _initedTabs_find;
|
|
@@ -170,7 +172,7 @@ class Tabs {
|
|
|
170
172
|
if (0 === existingPages.length) return;
|
|
171
173
|
const initTabTasks = existingPages.filter((pptrPage)=>!(0, index_js_namespaceObject.validateNavigationUrl)(pptrPage.url()).ignored).map(async (pptrPage)=>{
|
|
172
174
|
const tabId = pptrPage.target()._targetId;
|
|
173
|
-
const tab = this.createTabInstance(pptrPage, {
|
|
175
|
+
const tab = await this.createTabInstance(pptrPage, {
|
|
174
176
|
tabId: tabId,
|
|
175
177
|
..._class_private_field_get(this, _options)
|
|
176
178
|
});
|
|
@@ -287,7 +289,7 @@ async function createTab(targetId, pptrPage) {
|
|
|
287
289
|
_ts_add_disposable_resource(env, await _class_private_field_get(this, _cteateMutex).acquire(), false);
|
|
288
290
|
if (_class_private_field_get(this, _operations).creatingTargetIds.has(targetId)) return targetId;
|
|
289
291
|
_class_private_field_get(this, _operations).creatingTargetIds.add(targetId);
|
|
290
|
-
const tab = this.createTabInstance(pptrPage, {
|
|
292
|
+
const tab = await this.createTabInstance(pptrPage, {
|
|
291
293
|
tabId: targetId,
|
|
292
294
|
..._class_private_field_get(this, _options)
|
|
293
295
|
});
|
|
@@ -422,19 +424,7 @@ function setupTabEvents(tab, tabId) {
|
|
|
422
424
|
};
|
|
423
425
|
this.state.tabs.set(tabId, updatedTabMeta);
|
|
424
426
|
});
|
|
425
|
-
tab.on(tabs_js_namespaceObject.TabEvents.TabUrlChanged, (event)=>
|
|
426
|
-
const currentTabMeta = this.state.tabs.get(tabId);
|
|
427
|
-
if (!currentTabMeta) return;
|
|
428
|
-
const updatedTabMeta = {
|
|
429
|
-
...currentTabMeta,
|
|
430
|
-
url: event.newUrl,
|
|
431
|
-
title: event.title,
|
|
432
|
-
favicon: event.favicon,
|
|
433
|
-
canGoBack: event.canGoBack,
|
|
434
|
-
canGoForward: event.canGoForward
|
|
435
|
-
};
|
|
436
|
-
this.state.tabs.set(tabId, updatedTabMeta);
|
|
437
|
-
});
|
|
427
|
+
tab.on(tabs_js_namespaceObject.TabEvents.TabUrlChanged, (event)=>_class_private_method_get(this, _syncTabMeta, syncTabMeta).call(this, event.tabId));
|
|
438
428
|
tab.on(tabs_js_namespaceObject.TabEvents.TabVisibilityChanged, (event)=>{
|
|
439
429
|
if (event.isVisible) _class_private_method_get(this, _activeTab, tabs_activeTab).call(this, event.tabId);
|
|
440
430
|
});
|
package/dist/tabs/tabs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs/tabs.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/tabs.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 { proxy, subscribe } from 'valtio';\nimport { proxyMap } from 'valtio/utils';\nimport { Tab } from './tab';\nimport { validateNavigationUrl, Mutex } from '../utils';\n\nimport type { Browser, Page, Target } from 'puppeteer-core';\nimport {\n TabEvents,\n type TabEventsMap,\n type TabMeta,\n type TabOptions,\n type TabsState,\n type TabsOperationTracker,\n type TabsOptions,\n type DialogMeta,\n} from '../types/tabs';\n\nexport class Tabs<T extends Tab = Tab> {\n #pptrBrowser: Browser;\n #tabs: Map<string, T>;\n #options: TabsOptions;\n\n #operations: TabsOperationTracker;\n\n public state: TabsState;\n #isIntentionalDestroy = false;\n\n static async create(browser: Browser, options: TabsOptions) {\n const tabs = new Tabs(browser, options);\n await tabs.initializeExistingTabs();\n return tabs;\n }\n\n constructor(browser: Browser, options: TabsOptions) {\n this.#pptrBrowser = browser;\n this.#options = options;\n\n this.#tabs = new Map<string, T>();\n this.state = proxy({\n tabs: proxyMap<string, TabMeta>(),\n activeTabId: null,\n });\n this.#operations = {\n creatingTargetIds: new Set<string>(),\n switchingTargetIds: new Set<string>(),\n closingTargetIds: new Set<string>(),\n };\n\n // tabs events\n this.#pptrBrowser.on('targetcreated', (target) =>\n this.#handleTargetCreated(target),\n );\n this.#pptrBrowser.on('targetdestroyed', (target) =>\n this.#handleTargetDestroyed(target),\n );\n }\n\n subscribe(callback: () => void): () => void {\n return subscribe(this.state, callback);\n }\n\n getSnapshot(): TabsState {\n return {\n tabs: new Map(this.state.tabs),\n activeTabId: this.state.activeTabId,\n };\n }\n\n protected createTabInstance(page: Page, options: TabOptions): T {\n return new Tab(page, options) as T;\n }\n\n // #region init ExistingTabs\n\n protected async initializeExistingTabs() {\n const existingPages = await this.#pptrBrowser.pages();\n\n // console.log('initializeExistingTabs', existingPages);\n\n if (existingPages.length === 0) {\n return;\n }\n\n // init all existing tabs\n const initTabTasks = existingPages\n .filter((pptrPage) => !validateNavigationUrl(pptrPage.url()).ignored) // not allowed chrome devtools frontend\n .map(async (pptrPage) => {\n // @ts-ignore\n const tabId = pptrPage.target()._targetId;\n const tab = this.createTabInstance(pptrPage, {\n tabId: tabId,\n ...this.#options,\n });\n\n this.#tabs.set(tabId, tab);\n this.#setupTabEvents(tab, tabId);\n await this.#syncTabMeta(tabId);\n\n const isActive = await tab._checkActiveStatusWithRuntime();\n return { tabId, pptrPage, isActive };\n });\n const initedTabs = await Promise.all(initTabTasks);\n\n // active tab\n let activeTabId = initedTabs.find((result) => result.isActive)?.tabId;\n if (!activeTabId) {\n activeTabId = initedTabs[0].tabId;\n }\n\n await this.#activeTab(activeTabId);\n }\n\n // #endregion\n\n // #region createTab\n\n #cteateMutex = new Mutex();\n async #createTab(targetId: string, pptrPage: Page) {\n using _ = await this.#cteateMutex.acquire();\n\n if (this.#operations.creatingTargetIds.has(targetId)) {\n return targetId;\n }\n this.#operations.creatingTargetIds.add(targetId);\n\n const tab = this.createTabInstance(pptrPage, {\n tabId: targetId,\n ...this.#options,\n });\n\n this.#tabs.set(targetId, tab);\n this.#setupTabEvents(tab, targetId);\n await this.#syncTabMeta(targetId);\n\n return targetId;\n }\n\n async #handleTargetCreated(target: Target) {\n if (target.type() !== 'page') {\n return;\n }\n const pptrPage = await target.page();\n if (!pptrPage) {\n return;\n }\n // @ts-ignore\n const targetId = target._targetId;\n\n console.log('handleTargetCreated', targetId);\n\n await this.#createTab(targetId, pptrPage);\n await this.#activeTab(targetId);\n\n return targetId;\n }\n\n async createTab(): Promise<string> {\n const pptrPage = await this.#pptrBrowser.newPage();\n // @ts-ignore\n const targetId = pptrPage.target()._targetId;\n\n await this.#createTab(targetId, pptrPage);\n await this.#activeTab(targetId);\n\n return targetId;\n }\n\n // #endregion\n\n // #region activeTab\n\n #activeMutex = new Mutex();\n async #activeTab(tabId: string) {\n using _ = await this.#activeMutex.acquire();\n\n // console.trace('#activeTab', tabId);\n\n // check lock\n if (this.#operations.switchingTargetIds.has(tabId)) {\n return false;\n }\n this.#operations.switchingTargetIds.add(tabId);\n\n // check tab existence\n const tab = this.#tabs.get(tabId);\n if (!tab) {\n this.#operations.switchingTargetIds.delete(tabId);\n return false;\n }\n if (this.state.activeTabId === tabId) {\n this.#operations.switchingTargetIds.delete(tabId);\n return true;\n }\n\n // active select tab\n this.state.activeTabId = tabId;\n await tab._active();\n await this.#syncTabMeta(this.state.activeTabId);\n\n // inactivate other tabs\n const inactivePromises = [];\n for (const [id, tabInstance] of this.#tabs) {\n if (id !== tabId) {\n inactivePromises.push(tabInstance._inactive());\n }\n }\n await Promise.all(inactivePromises);\n\n // release lock\n this.#operations.switchingTargetIds.delete(tabId);\n\n return true;\n }\n\n async activeTab(tabId: string): Promise<boolean> {\n console.log('public activeTab', tabId);\n\n return await this.#activeTab(tabId);\n }\n\n getActiveTab(): T | null {\n if (!this.state.activeTabId) return null;\n return this.#tabs.get(this.state.activeTabId) || null;\n }\n\n // #endregion\n\n // #region closeTab\n\n #closeMutex = new Mutex();\n async #closeTab(tabId: string): Promise<boolean> {\n using _ = await this.#closeMutex.acquire();\n\n // check\n if (this.#operations.closingTargetIds.has(tabId)) {\n return false;\n }\n this.#operations.closingTargetIds.add(tabId);\n\n // close tab\n const tab = this.#tabs.get(tabId);\n if (!tab) {\n return false;\n }\n await tab._close();\n this.#tabs.delete(tabId);\n this.state.tabs.delete(tabId);\n\n // fallback logic to prevent the browser from being closed directly\n if (this.state.activeTabId === tabId) {\n this.state.activeTabId = null;\n\n if (this.#tabs.size === 0 && !this.#isIntentionalDestroy) {\n await this.createTab();\n }\n }\n\n return true;\n }\n\n async #handleTargetDestroyed(target: Target) {\n if (target.type() !== 'page') {\n return;\n }\n\n // @ts-ignore\n const targetId = target._targetId;\n await this.#closeTab(targetId);\n }\n\n async closeTab(tabId: string): Promise<boolean> {\n return await this.#closeTab(tabId);\n }\n\n // #endregion\n\n // #region public methods\n\n getCurrentUrl(): string {\n const activeTab = this.getActiveTab();\n return activeTab ? activeTab.url : 'about:blank';\n }\n\n hasTab(tabId: string): boolean {\n return this.state.tabs.has(tabId);\n }\n\n async destroy(): Promise<void> {\n this.#isIntentionalDestroy = true;\n\n const closeTasks = Array.from(this.#tabs.keys()).map((tabId) =>\n this.closeTab(tabId),\n );\n await Promise.all(closeTasks);\n }\n\n // #endregion\n\n // #region private methods\n\n async #syncTabMeta(tabId: string, isLoading = false): Promise<void> {\n const tab = this.#tabs.get(tabId);\n if (!tab) return;\n\n const [title, favicon, historyData] = await Promise.all([\n tab.getTitle().catch(() => 'Loading...'),\n tab.getFavicon().catch(() => ''),\n tab.getHistory().catch(() => ({\n index: 0,\n history: [],\n canGoBack: false,\n canGoForward: false,\n })),\n ]);\n\n const tabMeta: TabMeta = {\n id: tabId,\n url: tab.url || 'about:blank',\n title: title,\n favicon: favicon,\n isLoading: isLoading,\n isActive: tabId === this.state.activeTabId,\n canGoBack: historyData.canGoBack,\n canGoForward: historyData.canGoForward,\n };\n\n // console.log('syncTabMeta', tabId, tabMeta);\n\n this.state.tabs.set(tabId, tabMeta);\n }\n\n #updateTabDialog(tabId: string, dialogMeta: DialogMeta | null): void {\n const currentTabMeta = this.state.tabs.get(tabId);\n if (!currentTabMeta) return;\n\n const updatedTabMeta: TabMeta = {\n ...currentTabMeta,\n dialog: dialogMeta || undefined,\n };\n\n this.state.tabs.set(tabId, updatedTabMeta);\n }\n\n #setupTabEvents(tab: Tab, tabId: string): void {\n tab.on(\n TabEvents.TabLoadingStateChanged,\n (event: TabEventsMap[TabEvents.TabLoadingStateChanged]) => {\n const currentTabMeta = this.state.tabs.get(tabId);\n if (!currentTabMeta) return;\n\n const updatedTabMeta: TabMeta = {\n ...currentTabMeta,\n isLoading: event.isLoading,\n };\n\n this.state.tabs.set(tabId, updatedTabMeta);\n },\n );\n tab.on(\n TabEvents.TabUrlChanged,\n (event: TabEventsMap[TabEvents.TabUrlChanged]) => {\n const currentTabMeta = this.state.tabs.get(tabId);\n if (!currentTabMeta) return;\n\n const updatedTabMeta: TabMeta = {\n ...currentTabMeta,\n url: event.newUrl,\n title: event.title,\n favicon: event.favicon,\n canGoBack: event.canGoBack,\n canGoForward: event.canGoForward,\n };\n\n this.state.tabs.set(tabId, updatedTabMeta);\n },\n );\n tab.on(\n TabEvents.TabVisibilityChanged,\n (event: TabEventsMap[TabEvents.TabVisibilityChanged]) => {\n if (event.isVisible) {\n this.#activeTab(event.tabId);\n }\n },\n );\n tab.on(\n TabEvents.TabDialogChanged,\n (event: TabEventsMap[TabEvents.TabDialogChanged]) => {\n if (event.isOpen) {\n this.#updateTabDialog(tabId, {\n type: event.type!,\n message: event.message!,\n defaultValue: event.defaultValue!,\n });\n } else {\n this.#updateTabDialog(tabId, null);\n }\n },\n );\n }\n\n // #endregion\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","_pptrBrowser","_tabs","_options","_operations","_isIntentionalDestroy","_cteateMutex","_createTab","_handleTargetCreated","_activeMutex","_activeTab","_closeMutex","_closeTab","_handleTargetDestroyed","_syncTabMeta","updateTabDialog","setupTabEvents","Tabs","browser","options","tabs","callback","subscribe","Map","page","Tab","_initedTabs_find","existingPages","initTabTasks","pptrPage","validateNavigationUrl","tabId","tab","syncTabMeta","isActive","initedTabs","Promise","activeTabId","result","activeTab","targetId","createTab","console","closeTab","closeTasks","Array","handleTargetCreated","handleTargetDestroyed","Mutex","proxy","proxyMap","Set","target","_","inactivePromises","id","tabInstance","isLoading","title","favicon","historyData","tabMeta","dialogMeta","currentTabMeta","updatedTabMeta","undefined","TabEvents","event"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tabs/tabs.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/tabs.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 { proxy, subscribe } from 'valtio';\nimport { proxyMap } from 'valtio/utils';\nimport { Tab } from './tab';\nimport { validateNavigationUrl, Mutex } from '../utils';\n\nimport type { Browser, Page, Target } from 'puppeteer-core';\nimport {\n TabEvents,\n type TabEventsMap,\n type TabMeta,\n type TabOptions,\n type TabsState,\n type TabsOperationTracker,\n type TabsOptions,\n type DialogMeta,\n} from '../types/tabs';\n\nexport class Tabs<T extends Tab = Tab> {\n #pptrBrowser: Browser;\n #tabs: Map<string, T>;\n #options: TabsOptions;\n\n #operations: TabsOperationTracker;\n\n public state: TabsState;\n #isIntentionalDestroy = false;\n\n static async create(browser: Browser, options: TabsOptions) {\n const tabs = new Tabs(browser, options);\n await tabs.initializeExistingTabs();\n return tabs;\n }\n\n constructor(browser: Browser, options: TabsOptions) {\n this.#pptrBrowser = browser;\n this.#options = options;\n\n this.#tabs = new Map<string, T>();\n this.state = proxy({\n tabs: proxyMap<string, TabMeta>(),\n activeTabId: null,\n });\n this.#operations = {\n creatingTargetIds: new Set<string>(),\n switchingTargetIds: new Set<string>(),\n closingTargetIds: new Set<string>(),\n };\n\n // tabs events\n this.#pptrBrowser.on('targetcreated', (target) =>\n this.#handleTargetCreated(target),\n );\n this.#pptrBrowser.on('targetdestroyed', (target) =>\n this.#handleTargetDestroyed(target),\n );\n }\n\n subscribe(callback: () => void): () => void {\n return subscribe(this.state, callback);\n }\n\n getSnapshot(): TabsState {\n return {\n tabs: new Map(this.state.tabs),\n activeTabId: this.state.activeTabId,\n };\n }\n\n protected async createTabInstance(\n page: Page,\n options: TabOptions,\n ): Promise<T> {\n const tab = new Tab(page, options) as T;\n await tab.init();\n\n return tab;\n }\n\n // #region init ExistingTabs\n\n protected async initializeExistingTabs() {\n const existingPages = await this.#pptrBrowser.pages();\n\n // console.log('initializeExistingTabs', existingPages);\n\n if (existingPages.length === 0) {\n return;\n }\n\n // init all existing tabs\n const initTabTasks = existingPages\n .filter((pptrPage) => !validateNavigationUrl(pptrPage.url()).ignored) // not allowed chrome devtools frontend\n .map(async (pptrPage) => {\n // @ts-ignore\n const tabId = pptrPage.target()._targetId;\n const tab = await this.createTabInstance(pptrPage, {\n tabId: tabId,\n ...this.#options,\n });\n\n this.#tabs.set(tabId, tab);\n this.#setupTabEvents(tab, tabId);\n await this.#syncTabMeta(tabId);\n\n const isActive = await tab._checkActiveStatusWithRuntime();\n return { tabId, pptrPage, isActive };\n });\n const initedTabs = await Promise.all(initTabTasks);\n\n // active tab\n let activeTabId = initedTabs.find((result) => result.isActive)?.tabId;\n if (!activeTabId) {\n activeTabId = initedTabs[0].tabId;\n }\n\n await this.#activeTab(activeTabId);\n }\n\n // #endregion\n\n // #region createTab\n\n #cteateMutex = new Mutex();\n async #createTab(targetId: string, pptrPage: Page) {\n using _ = await this.#cteateMutex.acquire();\n\n if (this.#operations.creatingTargetIds.has(targetId)) {\n return targetId;\n }\n this.#operations.creatingTargetIds.add(targetId);\n\n const tab = await this.createTabInstance(pptrPage, {\n tabId: targetId,\n ...this.#options,\n });\n\n this.#tabs.set(targetId, tab);\n this.#setupTabEvents(tab, targetId);\n await this.#syncTabMeta(targetId);\n\n return targetId;\n }\n\n async #handleTargetCreated(target: Target) {\n if (target.type() !== 'page') {\n return;\n }\n const pptrPage = await target.page();\n if (!pptrPage) {\n return;\n }\n // @ts-ignore\n const targetId = target._targetId;\n\n console.log('handleTargetCreated', targetId);\n\n await this.#createTab(targetId, pptrPage);\n await this.#activeTab(targetId);\n\n return targetId;\n }\n\n async createTab(): Promise<string> {\n const pptrPage = await this.#pptrBrowser.newPage();\n // @ts-ignore\n const targetId = pptrPage.target()._targetId;\n\n await this.#createTab(targetId, pptrPage);\n await this.#activeTab(targetId);\n\n return targetId;\n }\n\n // #endregion\n\n // #region activeTab\n\n #activeMutex = new Mutex();\n async #activeTab(tabId: string) {\n using _ = await this.#activeMutex.acquire();\n\n // console.trace('#activeTab', tabId);\n\n // check lock\n if (this.#operations.switchingTargetIds.has(tabId)) {\n return false;\n }\n this.#operations.switchingTargetIds.add(tabId);\n\n // check tab existence\n const tab = this.#tabs.get(tabId);\n if (!tab) {\n this.#operations.switchingTargetIds.delete(tabId);\n return false;\n }\n if (this.state.activeTabId === tabId) {\n this.#operations.switchingTargetIds.delete(tabId);\n return true;\n }\n\n // active select tab\n this.state.activeTabId = tabId;\n await tab._active();\n await this.#syncTabMeta(this.state.activeTabId);\n\n // inactivate other tabs\n const inactivePromises = [];\n for (const [id, tabInstance] of this.#tabs) {\n if (id !== tabId) {\n inactivePromises.push(tabInstance._inactive());\n }\n }\n await Promise.all(inactivePromises);\n\n // release lock\n this.#operations.switchingTargetIds.delete(tabId);\n\n return true;\n }\n\n async activeTab(tabId: string): Promise<boolean> {\n console.log('public activeTab', tabId);\n\n return await this.#activeTab(tabId);\n }\n\n getActiveTab(): T | null {\n if (!this.state.activeTabId) return null;\n return this.#tabs.get(this.state.activeTabId) || null;\n }\n\n // #endregion\n\n // #region closeTab\n\n #closeMutex = new Mutex();\n async #closeTab(tabId: string): Promise<boolean> {\n using _ = await this.#closeMutex.acquire();\n\n // check\n if (this.#operations.closingTargetIds.has(tabId)) {\n return false;\n }\n this.#operations.closingTargetIds.add(tabId);\n\n // close tab\n const tab = this.#tabs.get(tabId);\n if (!tab) {\n return false;\n }\n await tab._close();\n this.#tabs.delete(tabId);\n this.state.tabs.delete(tabId);\n\n // fallback logic to prevent the browser from being closed directly\n if (this.state.activeTabId === tabId) {\n this.state.activeTabId = null;\n\n if (this.#tabs.size === 0 && !this.#isIntentionalDestroy) {\n await this.createTab();\n }\n }\n\n return true;\n }\n\n async #handleTargetDestroyed(target: Target) {\n if (target.type() !== 'page') {\n return;\n }\n\n // @ts-ignore\n const targetId = target._targetId;\n await this.#closeTab(targetId);\n }\n\n async closeTab(tabId: string): Promise<boolean> {\n return await this.#closeTab(tabId);\n }\n\n // #endregion\n\n // #region public methods\n\n getCurrentUrl(): string {\n const activeTab = this.getActiveTab();\n return activeTab ? activeTab.url : 'about:blank';\n }\n\n hasTab(tabId: string): boolean {\n return this.state.tabs.has(tabId);\n }\n\n async destroy(): Promise<void> {\n this.#isIntentionalDestroy = true;\n\n const closeTasks = Array.from(this.#tabs.keys()).map((tabId) =>\n this.closeTab(tabId),\n );\n await Promise.all(closeTasks);\n }\n\n // #endregion\n\n // #region private methods\n\n async #syncTabMeta(tabId: string, isLoading = false): Promise<void> {\n const tab = this.#tabs.get(tabId);\n if (!tab) return;\n\n const [title, favicon, historyData] = await Promise.all([\n tab.getTitle().catch(() => 'Loading...'),\n tab.getFavicon().catch(() => ''),\n tab.getHistory().catch(() => ({\n index: 0,\n history: [],\n canGoBack: false,\n canGoForward: false,\n })),\n ]);\n\n const tabMeta: TabMeta = {\n id: tabId,\n url: tab.url || 'about:blank',\n title: title,\n favicon: favicon,\n isLoading: isLoading,\n isActive: tabId === this.state.activeTabId,\n canGoBack: historyData.canGoBack,\n canGoForward: historyData.canGoForward,\n };\n\n // console.log('syncTabMeta', tabId, tabMeta);\n\n this.state.tabs.set(tabId, tabMeta);\n }\n\n #updateTabDialog(tabId: string, dialogMeta: DialogMeta | null): void {\n const currentTabMeta = this.state.tabs.get(tabId);\n if (!currentTabMeta) return;\n\n const updatedTabMeta: TabMeta = {\n ...currentTabMeta,\n dialog: dialogMeta || undefined,\n };\n\n this.state.tabs.set(tabId, updatedTabMeta);\n }\n\n #setupTabEvents(tab: Tab, tabId: string): void {\n tab.on(\n TabEvents.TabLoadingStateChanged,\n (event: TabEventsMap[TabEvents.TabLoadingStateChanged]) => {\n const currentTabMeta = this.state.tabs.get(tabId);\n if (!currentTabMeta) return;\n\n const updatedTabMeta: TabMeta = {\n ...currentTabMeta,\n isLoading: event.isLoading,\n };\n\n this.state.tabs.set(tabId, updatedTabMeta);\n },\n );\n tab.on(\n TabEvents.TabUrlChanged,\n (event: TabEventsMap[TabEvents.TabUrlChanged]) =>\n this.#syncTabMeta(event.tabId),\n );\n tab.on(\n TabEvents.TabVisibilityChanged,\n (event: TabEventsMap[TabEvents.TabVisibilityChanged]) => {\n if (event.isVisible) {\n this.#activeTab(event.tabId);\n }\n },\n );\n tab.on(\n TabEvents.TabDialogChanged,\n (event: TabEventsMap[TabEvents.TabDialogChanged]) => {\n if (event.isOpen) {\n this.#updateTabDialog(tabId, {\n type: event.type!,\n message: event.message!,\n defaultValue: event.defaultValue!,\n });\n } else {\n this.#updateTabDialog(tabId, null);\n }\n },\n );\n }\n\n // #endregion\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","_pptrBrowser","_tabs","_options","_operations","_isIntentionalDestroy","_cteateMutex","_createTab","_handleTargetCreated","_activeMutex","_activeTab","_closeMutex","_closeTab","_handleTargetDestroyed","_syncTabMeta","updateTabDialog","setupTabEvents","Tabs","browser","options","tabs","callback","subscribe","Map","page","tab","Tab","_initedTabs_find","existingPages","initTabTasks","pptrPage","validateNavigationUrl","tabId","syncTabMeta","isActive","initedTabs","Promise","activeTabId","result","activeTab","targetId","createTab","console","closeTab","closeTasks","Array","handleTargetCreated","handleTargetDestroyed","Mutex","proxy","proxyMap","Set","target","_","inactivePromises","id","tabInstance","isLoading","title","favicon","historyData","tabMeta","dialogMeta","currentTabMeta","updatedTabMeta","undefined","TabEvents","event"],"mappings":"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"}
|
package/dist/tabs/tabs.mjs
CHANGED
|
@@ -133,8 +133,10 @@ class Tabs {
|
|
|
133
133
|
activeTabId: this.state.activeTabId
|
|
134
134
|
};
|
|
135
135
|
}
|
|
136
|
-
createTabInstance(page, options) {
|
|
137
|
-
|
|
136
|
+
async createTabInstance(page, options) {
|
|
137
|
+
const tab = new Tab(page, options);
|
|
138
|
+
await tab.init();
|
|
139
|
+
return tab;
|
|
138
140
|
}
|
|
139
141
|
async initializeExistingTabs() {
|
|
140
142
|
var _initedTabs_find;
|
|
@@ -142,7 +144,7 @@ class Tabs {
|
|
|
142
144
|
if (0 === existingPages.length) return;
|
|
143
145
|
const initTabTasks = existingPages.filter((pptrPage)=>!validateNavigationUrl(pptrPage.url()).ignored).map(async (pptrPage)=>{
|
|
144
146
|
const tabId = pptrPage.target()._targetId;
|
|
145
|
-
const tab = this.createTabInstance(pptrPage, {
|
|
147
|
+
const tab = await this.createTabInstance(pptrPage, {
|
|
146
148
|
tabId: tabId,
|
|
147
149
|
..._class_private_field_get(this, _options)
|
|
148
150
|
});
|
|
@@ -259,7 +261,7 @@ async function createTab(targetId, pptrPage) {
|
|
|
259
261
|
_ts_add_disposable_resource(env, await _class_private_field_get(this, _cteateMutex).acquire(), false);
|
|
260
262
|
if (_class_private_field_get(this, _operations).creatingTargetIds.has(targetId)) return targetId;
|
|
261
263
|
_class_private_field_get(this, _operations).creatingTargetIds.add(targetId);
|
|
262
|
-
const tab = this.createTabInstance(pptrPage, {
|
|
264
|
+
const tab = await this.createTabInstance(pptrPage, {
|
|
263
265
|
tabId: targetId,
|
|
264
266
|
..._class_private_field_get(this, _options)
|
|
265
267
|
});
|
|
@@ -394,19 +396,7 @@ function setupTabEvents(tab, tabId) {
|
|
|
394
396
|
};
|
|
395
397
|
this.state.tabs.set(tabId, updatedTabMeta);
|
|
396
398
|
});
|
|
397
|
-
tab.on(TabEvents.TabUrlChanged, (event)=>
|
|
398
|
-
const currentTabMeta = this.state.tabs.get(tabId);
|
|
399
|
-
if (!currentTabMeta) return;
|
|
400
|
-
const updatedTabMeta = {
|
|
401
|
-
...currentTabMeta,
|
|
402
|
-
url: event.newUrl,
|
|
403
|
-
title: event.title,
|
|
404
|
-
favicon: event.favicon,
|
|
405
|
-
canGoBack: event.canGoBack,
|
|
406
|
-
canGoForward: event.canGoForward
|
|
407
|
-
};
|
|
408
|
-
this.state.tabs.set(tabId, updatedTabMeta);
|
|
409
|
-
});
|
|
399
|
+
tab.on(TabEvents.TabUrlChanged, (event)=>_class_private_method_get(this, _syncTabMeta, syncTabMeta).call(this, event.tabId));
|
|
410
400
|
tab.on(TabEvents.TabVisibilityChanged, (event)=>{
|
|
411
401
|
if (event.isVisible) _class_private_method_get(this, _activeTab, tabs_activeTab).call(this, event.tabId);
|
|
412
402
|
});
|
package/dist/tabs/tabs.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs/tabs.mjs","sources":["webpack://@agent-infra/browser/./src/tabs/tabs.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { proxy, subscribe } from 'valtio';\nimport { proxyMap } from 'valtio/utils';\nimport { Tab } from './tab';\nimport { validateNavigationUrl, Mutex } from '../utils';\n\nimport type { Browser, Page, Target } from 'puppeteer-core';\nimport {\n TabEvents,\n type TabEventsMap,\n type TabMeta,\n type TabOptions,\n type TabsState,\n type TabsOperationTracker,\n type TabsOptions,\n type DialogMeta,\n} from '../types/tabs';\n\nexport class Tabs<T extends Tab = Tab> {\n #pptrBrowser: Browser;\n #tabs: Map<string, T>;\n #options: TabsOptions;\n\n #operations: TabsOperationTracker;\n\n public state: TabsState;\n #isIntentionalDestroy = false;\n\n static async create(browser: Browser, options: TabsOptions) {\n const tabs = new Tabs(browser, options);\n await tabs.initializeExistingTabs();\n return tabs;\n }\n\n constructor(browser: Browser, options: TabsOptions) {\n this.#pptrBrowser = browser;\n this.#options = options;\n\n this.#tabs = new Map<string, T>();\n this.state = proxy({\n tabs: proxyMap<string, TabMeta>(),\n activeTabId: null,\n });\n this.#operations = {\n creatingTargetIds: new Set<string>(),\n switchingTargetIds: new Set<string>(),\n closingTargetIds: new Set<string>(),\n };\n\n // tabs events\n this.#pptrBrowser.on('targetcreated', (target) =>\n this.#handleTargetCreated(target),\n );\n this.#pptrBrowser.on('targetdestroyed', (target) =>\n this.#handleTargetDestroyed(target),\n );\n }\n\n subscribe(callback: () => void): () => void {\n return subscribe(this.state, callback);\n }\n\n getSnapshot(): TabsState {\n return {\n tabs: new Map(this.state.tabs),\n activeTabId: this.state.activeTabId,\n };\n }\n\n protected createTabInstance(page: Page, options: TabOptions): T {\n return new Tab(page, options) as T;\n }\n\n // #region init ExistingTabs\n\n protected async initializeExistingTabs() {\n const existingPages = await this.#pptrBrowser.pages();\n\n // console.log('initializeExistingTabs', existingPages);\n\n if (existingPages.length === 0) {\n return;\n }\n\n // init all existing tabs\n const initTabTasks = existingPages\n .filter((pptrPage) => !validateNavigationUrl(pptrPage.url()).ignored) // not allowed chrome devtools frontend\n .map(async (pptrPage) => {\n // @ts-ignore\n const tabId = pptrPage.target()._targetId;\n const tab = this.createTabInstance(pptrPage, {\n tabId: tabId,\n ...this.#options,\n });\n\n this.#tabs.set(tabId, tab);\n this.#setupTabEvents(tab, tabId);\n await this.#syncTabMeta(tabId);\n\n const isActive = await tab._checkActiveStatusWithRuntime();\n return { tabId, pptrPage, isActive };\n });\n const initedTabs = await Promise.all(initTabTasks);\n\n // active tab\n let activeTabId = initedTabs.find((result) => result.isActive)?.tabId;\n if (!activeTabId) {\n activeTabId = initedTabs[0].tabId;\n }\n\n await this.#activeTab(activeTabId);\n }\n\n // #endregion\n\n // #region createTab\n\n #cteateMutex = new Mutex();\n async #createTab(targetId: string, pptrPage: Page) {\n using _ = await this.#cteateMutex.acquire();\n\n if (this.#operations.creatingTargetIds.has(targetId)) {\n return targetId;\n }\n this.#operations.creatingTargetIds.add(targetId);\n\n const tab = this.createTabInstance(pptrPage, {\n tabId: targetId,\n ...this.#options,\n });\n\n this.#tabs.set(targetId, tab);\n this.#setupTabEvents(tab, targetId);\n await this.#syncTabMeta(targetId);\n\n return targetId;\n }\n\n async #handleTargetCreated(target: Target) {\n if (target.type() !== 'page') {\n return;\n }\n const pptrPage = await target.page();\n if (!pptrPage) {\n return;\n }\n // @ts-ignore\n const targetId = target._targetId;\n\n console.log('handleTargetCreated', targetId);\n\n await this.#createTab(targetId, pptrPage);\n await this.#activeTab(targetId);\n\n return targetId;\n }\n\n async createTab(): Promise<string> {\n const pptrPage = await this.#pptrBrowser.newPage();\n // @ts-ignore\n const targetId = pptrPage.target()._targetId;\n\n await this.#createTab(targetId, pptrPage);\n await this.#activeTab(targetId);\n\n return targetId;\n }\n\n // #endregion\n\n // #region activeTab\n\n #activeMutex = new Mutex();\n async #activeTab(tabId: string) {\n using _ = await this.#activeMutex.acquire();\n\n // console.trace('#activeTab', tabId);\n\n // check lock\n if (this.#operations.switchingTargetIds.has(tabId)) {\n return false;\n }\n this.#operations.switchingTargetIds.add(tabId);\n\n // check tab existence\n const tab = this.#tabs.get(tabId);\n if (!tab) {\n this.#operations.switchingTargetIds.delete(tabId);\n return false;\n }\n if (this.state.activeTabId === tabId) {\n this.#operations.switchingTargetIds.delete(tabId);\n return true;\n }\n\n // active select tab\n this.state.activeTabId = tabId;\n await tab._active();\n await this.#syncTabMeta(this.state.activeTabId);\n\n // inactivate other tabs\n const inactivePromises = [];\n for (const [id, tabInstance] of this.#tabs) {\n if (id !== tabId) {\n inactivePromises.push(tabInstance._inactive());\n }\n }\n await Promise.all(inactivePromises);\n\n // release lock\n this.#operations.switchingTargetIds.delete(tabId);\n\n return true;\n }\n\n async activeTab(tabId: string): Promise<boolean> {\n console.log('public activeTab', tabId);\n\n return await this.#activeTab(tabId);\n }\n\n getActiveTab(): T | null {\n if (!this.state.activeTabId) return null;\n return this.#tabs.get(this.state.activeTabId) || null;\n }\n\n // #endregion\n\n // #region closeTab\n\n #closeMutex = new Mutex();\n async #closeTab(tabId: string): Promise<boolean> {\n using _ = await this.#closeMutex.acquire();\n\n // check\n if (this.#operations.closingTargetIds.has(tabId)) {\n return false;\n }\n this.#operations.closingTargetIds.add(tabId);\n\n // close tab\n const tab = this.#tabs.get(tabId);\n if (!tab) {\n return false;\n }\n await tab._close();\n this.#tabs.delete(tabId);\n this.state.tabs.delete(tabId);\n\n // fallback logic to prevent the browser from being closed directly\n if (this.state.activeTabId === tabId) {\n this.state.activeTabId = null;\n\n if (this.#tabs.size === 0 && !this.#isIntentionalDestroy) {\n await this.createTab();\n }\n }\n\n return true;\n }\n\n async #handleTargetDestroyed(target: Target) {\n if (target.type() !== 'page') {\n return;\n }\n\n // @ts-ignore\n const targetId = target._targetId;\n await this.#closeTab(targetId);\n }\n\n async closeTab(tabId: string): Promise<boolean> {\n return await this.#closeTab(tabId);\n }\n\n // #endregion\n\n // #region public methods\n\n getCurrentUrl(): string {\n const activeTab = this.getActiveTab();\n return activeTab ? activeTab.url : 'about:blank';\n }\n\n hasTab(tabId: string): boolean {\n return this.state.tabs.has(tabId);\n }\n\n async destroy(): Promise<void> {\n this.#isIntentionalDestroy = true;\n\n const closeTasks = Array.from(this.#tabs.keys()).map((tabId) =>\n this.closeTab(tabId),\n );\n await Promise.all(closeTasks);\n }\n\n // #endregion\n\n // #region private methods\n\n async #syncTabMeta(tabId: string, isLoading = false): Promise<void> {\n const tab = this.#tabs.get(tabId);\n if (!tab) return;\n\n const [title, favicon, historyData] = await Promise.all([\n tab.getTitle().catch(() => 'Loading...'),\n tab.getFavicon().catch(() => ''),\n tab.getHistory().catch(() => ({\n index: 0,\n history: [],\n canGoBack: false,\n canGoForward: false,\n })),\n ]);\n\n const tabMeta: TabMeta = {\n id: tabId,\n url: tab.url || 'about:blank',\n title: title,\n favicon: favicon,\n isLoading: isLoading,\n isActive: tabId === this.state.activeTabId,\n canGoBack: historyData.canGoBack,\n canGoForward: historyData.canGoForward,\n };\n\n // console.log('syncTabMeta', tabId, tabMeta);\n\n this.state.tabs.set(tabId, tabMeta);\n }\n\n #updateTabDialog(tabId: string, dialogMeta: DialogMeta | null): void {\n const currentTabMeta = this.state.tabs.get(tabId);\n if (!currentTabMeta) return;\n\n const updatedTabMeta: TabMeta = {\n ...currentTabMeta,\n dialog: dialogMeta || undefined,\n };\n\n this.state.tabs.set(tabId, updatedTabMeta);\n }\n\n #setupTabEvents(tab: Tab, tabId: string): void {\n tab.on(\n TabEvents.TabLoadingStateChanged,\n (event: TabEventsMap[TabEvents.TabLoadingStateChanged]) => {\n const currentTabMeta = this.state.tabs.get(tabId);\n if (!currentTabMeta) return;\n\n const updatedTabMeta: TabMeta = {\n ...currentTabMeta,\n isLoading: event.isLoading,\n };\n\n this.state.tabs.set(tabId, updatedTabMeta);\n },\n );\n tab.on(\n TabEvents.TabUrlChanged,\n (event: TabEventsMap[TabEvents.TabUrlChanged]) => {\n const currentTabMeta = this.state.tabs.get(tabId);\n if (!currentTabMeta) return;\n\n const updatedTabMeta: TabMeta = {\n ...currentTabMeta,\n url: event.newUrl,\n title: event.title,\n favicon: event.favicon,\n canGoBack: event.canGoBack,\n canGoForward: event.canGoForward,\n };\n\n this.state.tabs.set(tabId, updatedTabMeta);\n },\n );\n tab.on(\n TabEvents.TabVisibilityChanged,\n (event: TabEventsMap[TabEvents.TabVisibilityChanged]) => {\n if (event.isVisible) {\n this.#activeTab(event.tabId);\n }\n },\n );\n tab.on(\n TabEvents.TabDialogChanged,\n (event: TabEventsMap[TabEvents.TabDialogChanged]) => {\n if (event.isOpen) {\n this.#updateTabDialog(tabId, {\n type: event.type!,\n message: event.message!,\n defaultValue: event.defaultValue!,\n });\n } else {\n this.#updateTabDialog(tabId, null);\n }\n },\n );\n }\n\n // #endregion\n}\n"],"names":["_pptrBrowser","_tabs","_options","_operations","_isIntentionalDestroy","_cteateMutex","_createTab","_handleTargetCreated","_activeMutex","_activeTab","_closeMutex","_closeTab","_handleTargetDestroyed","_syncTabMeta","updateTabDialog","setupTabEvents","Tabs","browser","options","tabs","callback","subscribe","Map","page","Tab","_initedTabs_find","existingPages","initTabTasks","pptrPage","validateNavigationUrl","tabId","tab","syncTabMeta","isActive","initedTabs","Promise","activeTabId","result","activeTab","targetId","createTab","console","closeTab","closeTasks","Array","handleTargetCreated","handleTargetDestroyed","Mutex","proxy","proxyMap","Set","target","_","inactivePromises","id","tabInstance","isLoading","title","favicon","historyData","tabMeta","dialogMeta","currentTabMeta","updatedTabMeta","undefined","TabEvents","event"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tabs/tabs.mjs","sources":["webpack://@agent-infra/browser/./src/tabs/tabs.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { proxy, subscribe } from 'valtio';\nimport { proxyMap } from 'valtio/utils';\nimport { Tab } from './tab';\nimport { validateNavigationUrl, Mutex } from '../utils';\n\nimport type { Browser, Page, Target } from 'puppeteer-core';\nimport {\n TabEvents,\n type TabEventsMap,\n type TabMeta,\n type TabOptions,\n type TabsState,\n type TabsOperationTracker,\n type TabsOptions,\n type DialogMeta,\n} from '../types/tabs';\n\nexport class Tabs<T extends Tab = Tab> {\n #pptrBrowser: Browser;\n #tabs: Map<string, T>;\n #options: TabsOptions;\n\n #operations: TabsOperationTracker;\n\n public state: TabsState;\n #isIntentionalDestroy = false;\n\n static async create(browser: Browser, options: TabsOptions) {\n const tabs = new Tabs(browser, options);\n await tabs.initializeExistingTabs();\n return tabs;\n }\n\n constructor(browser: Browser, options: TabsOptions) {\n this.#pptrBrowser = browser;\n this.#options = options;\n\n this.#tabs = new Map<string, T>();\n this.state = proxy({\n tabs: proxyMap<string, TabMeta>(),\n activeTabId: null,\n });\n this.#operations = {\n creatingTargetIds: new Set<string>(),\n switchingTargetIds: new Set<string>(),\n closingTargetIds: new Set<string>(),\n };\n\n // tabs events\n this.#pptrBrowser.on('targetcreated', (target) =>\n this.#handleTargetCreated(target),\n );\n this.#pptrBrowser.on('targetdestroyed', (target) =>\n this.#handleTargetDestroyed(target),\n );\n }\n\n subscribe(callback: () => void): () => void {\n return subscribe(this.state, callback);\n }\n\n getSnapshot(): TabsState {\n return {\n tabs: new Map(this.state.tabs),\n activeTabId: this.state.activeTabId,\n };\n }\n\n protected async createTabInstance(\n page: Page,\n options: TabOptions,\n ): Promise<T> {\n const tab = new Tab(page, options) as T;\n await tab.init();\n\n return tab;\n }\n\n // #region init ExistingTabs\n\n protected async initializeExistingTabs() {\n const existingPages = await this.#pptrBrowser.pages();\n\n // console.log('initializeExistingTabs', existingPages);\n\n if (existingPages.length === 0) {\n return;\n }\n\n // init all existing tabs\n const initTabTasks = existingPages\n .filter((pptrPage) => !validateNavigationUrl(pptrPage.url()).ignored) // not allowed chrome devtools frontend\n .map(async (pptrPage) => {\n // @ts-ignore\n const tabId = pptrPage.target()._targetId;\n const tab = await this.createTabInstance(pptrPage, {\n tabId: tabId,\n ...this.#options,\n });\n\n this.#tabs.set(tabId, tab);\n this.#setupTabEvents(tab, tabId);\n await this.#syncTabMeta(tabId);\n\n const isActive = await tab._checkActiveStatusWithRuntime();\n return { tabId, pptrPage, isActive };\n });\n const initedTabs = await Promise.all(initTabTasks);\n\n // active tab\n let activeTabId = initedTabs.find((result) => result.isActive)?.tabId;\n if (!activeTabId) {\n activeTabId = initedTabs[0].tabId;\n }\n\n await this.#activeTab(activeTabId);\n }\n\n // #endregion\n\n // #region createTab\n\n #cteateMutex = new Mutex();\n async #createTab(targetId: string, pptrPage: Page) {\n using _ = await this.#cteateMutex.acquire();\n\n if (this.#operations.creatingTargetIds.has(targetId)) {\n return targetId;\n }\n this.#operations.creatingTargetIds.add(targetId);\n\n const tab = await this.createTabInstance(pptrPage, {\n tabId: targetId,\n ...this.#options,\n });\n\n this.#tabs.set(targetId, tab);\n this.#setupTabEvents(tab, targetId);\n await this.#syncTabMeta(targetId);\n\n return targetId;\n }\n\n async #handleTargetCreated(target: Target) {\n if (target.type() !== 'page') {\n return;\n }\n const pptrPage = await target.page();\n if (!pptrPage) {\n return;\n }\n // @ts-ignore\n const targetId = target._targetId;\n\n console.log('handleTargetCreated', targetId);\n\n await this.#createTab(targetId, pptrPage);\n await this.#activeTab(targetId);\n\n return targetId;\n }\n\n async createTab(): Promise<string> {\n const pptrPage = await this.#pptrBrowser.newPage();\n // @ts-ignore\n const targetId = pptrPage.target()._targetId;\n\n await this.#createTab(targetId, pptrPage);\n await this.#activeTab(targetId);\n\n return targetId;\n }\n\n // #endregion\n\n // #region activeTab\n\n #activeMutex = new Mutex();\n async #activeTab(tabId: string) {\n using _ = await this.#activeMutex.acquire();\n\n // console.trace('#activeTab', tabId);\n\n // check lock\n if (this.#operations.switchingTargetIds.has(tabId)) {\n return false;\n }\n this.#operations.switchingTargetIds.add(tabId);\n\n // check tab existence\n const tab = this.#tabs.get(tabId);\n if (!tab) {\n this.#operations.switchingTargetIds.delete(tabId);\n return false;\n }\n if (this.state.activeTabId === tabId) {\n this.#operations.switchingTargetIds.delete(tabId);\n return true;\n }\n\n // active select tab\n this.state.activeTabId = tabId;\n await tab._active();\n await this.#syncTabMeta(this.state.activeTabId);\n\n // inactivate other tabs\n const inactivePromises = [];\n for (const [id, tabInstance] of this.#tabs) {\n if (id !== tabId) {\n inactivePromises.push(tabInstance._inactive());\n }\n }\n await Promise.all(inactivePromises);\n\n // release lock\n this.#operations.switchingTargetIds.delete(tabId);\n\n return true;\n }\n\n async activeTab(tabId: string): Promise<boolean> {\n console.log('public activeTab', tabId);\n\n return await this.#activeTab(tabId);\n }\n\n getActiveTab(): T | null {\n if (!this.state.activeTabId) return null;\n return this.#tabs.get(this.state.activeTabId) || null;\n }\n\n // #endregion\n\n // #region closeTab\n\n #closeMutex = new Mutex();\n async #closeTab(tabId: string): Promise<boolean> {\n using _ = await this.#closeMutex.acquire();\n\n // check\n if (this.#operations.closingTargetIds.has(tabId)) {\n return false;\n }\n this.#operations.closingTargetIds.add(tabId);\n\n // close tab\n const tab = this.#tabs.get(tabId);\n if (!tab) {\n return false;\n }\n await tab._close();\n this.#tabs.delete(tabId);\n this.state.tabs.delete(tabId);\n\n // fallback logic to prevent the browser from being closed directly\n if (this.state.activeTabId === tabId) {\n this.state.activeTabId = null;\n\n if (this.#tabs.size === 0 && !this.#isIntentionalDestroy) {\n await this.createTab();\n }\n }\n\n return true;\n }\n\n async #handleTargetDestroyed(target: Target) {\n if (target.type() !== 'page') {\n return;\n }\n\n // @ts-ignore\n const targetId = target._targetId;\n await this.#closeTab(targetId);\n }\n\n async closeTab(tabId: string): Promise<boolean> {\n return await this.#closeTab(tabId);\n }\n\n // #endregion\n\n // #region public methods\n\n getCurrentUrl(): string {\n const activeTab = this.getActiveTab();\n return activeTab ? activeTab.url : 'about:blank';\n }\n\n hasTab(tabId: string): boolean {\n return this.state.tabs.has(tabId);\n }\n\n async destroy(): Promise<void> {\n this.#isIntentionalDestroy = true;\n\n const closeTasks = Array.from(this.#tabs.keys()).map((tabId) =>\n this.closeTab(tabId),\n );\n await Promise.all(closeTasks);\n }\n\n // #endregion\n\n // #region private methods\n\n async #syncTabMeta(tabId: string, isLoading = false): Promise<void> {\n const tab = this.#tabs.get(tabId);\n if (!tab) return;\n\n const [title, favicon, historyData] = await Promise.all([\n tab.getTitle().catch(() => 'Loading...'),\n tab.getFavicon().catch(() => ''),\n tab.getHistory().catch(() => ({\n index: 0,\n history: [],\n canGoBack: false,\n canGoForward: false,\n })),\n ]);\n\n const tabMeta: TabMeta = {\n id: tabId,\n url: tab.url || 'about:blank',\n title: title,\n favicon: favicon,\n isLoading: isLoading,\n isActive: tabId === this.state.activeTabId,\n canGoBack: historyData.canGoBack,\n canGoForward: historyData.canGoForward,\n };\n\n // console.log('syncTabMeta', tabId, tabMeta);\n\n this.state.tabs.set(tabId, tabMeta);\n }\n\n #updateTabDialog(tabId: string, dialogMeta: DialogMeta | null): void {\n const currentTabMeta = this.state.tabs.get(tabId);\n if (!currentTabMeta) return;\n\n const updatedTabMeta: TabMeta = {\n ...currentTabMeta,\n dialog: dialogMeta || undefined,\n };\n\n this.state.tabs.set(tabId, updatedTabMeta);\n }\n\n #setupTabEvents(tab: Tab, tabId: string): void {\n tab.on(\n TabEvents.TabLoadingStateChanged,\n (event: TabEventsMap[TabEvents.TabLoadingStateChanged]) => {\n const currentTabMeta = this.state.tabs.get(tabId);\n if (!currentTabMeta) return;\n\n const updatedTabMeta: TabMeta = {\n ...currentTabMeta,\n isLoading: event.isLoading,\n };\n\n this.state.tabs.set(tabId, updatedTabMeta);\n },\n );\n tab.on(\n TabEvents.TabUrlChanged,\n (event: TabEventsMap[TabEvents.TabUrlChanged]) =>\n this.#syncTabMeta(event.tabId),\n );\n tab.on(\n TabEvents.TabVisibilityChanged,\n (event: TabEventsMap[TabEvents.TabVisibilityChanged]) => {\n if (event.isVisible) {\n this.#activeTab(event.tabId);\n }\n },\n );\n tab.on(\n TabEvents.TabDialogChanged,\n (event: TabEventsMap[TabEvents.TabDialogChanged]) => {\n if (event.isOpen) {\n this.#updateTabDialog(tabId, {\n type: event.type!,\n message: event.message!,\n defaultValue: event.defaultValue!,\n });\n } else {\n this.#updateTabDialog(tabId, null);\n }\n },\n );\n }\n\n // #endregion\n}\n"],"names":["_pptrBrowser","_tabs","_options","_operations","_isIntentionalDestroy","_cteateMutex","_createTab","_handleTargetCreated","_activeMutex","_activeTab","_closeMutex","_closeTab","_handleTargetDestroyed","_syncTabMeta","updateTabDialog","setupTabEvents","Tabs","browser","options","tabs","callback","subscribe","Map","page","tab","Tab","_initedTabs_find","existingPages","initTabTasks","pptrPage","validateNavigationUrl","tabId","syncTabMeta","isActive","initedTabs","Promise","activeTabId","result","activeTab","targetId","createTab","console","closeTab","closeTasks","Array","handleTargetCreated","handleTargetDestroyed","Mutex","proxy","proxyMap","Set","target","_","inactivePromises","id","tabInstance","isLoading","title","favicon","historyData","tabMeta","dialogMeta","currentTabMeta","updatedTabMeta","undefined","TabEvents","event"],"mappings":"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"}
|
package/dist/types/tabs.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export interface TabsOptions {
|
|
|
8
8
|
}
|
|
9
9
|
export interface TabOptions extends TabsOptions {
|
|
10
10
|
tabId: string;
|
|
11
|
+
injectVisibilityScript?: boolean;
|
|
11
12
|
}
|
|
12
13
|
export declare const enum TabEvents {
|
|
13
14
|
TabLoadingStateChanged = "tabLoadingStateChanged",
|
|
@@ -22,12 +23,8 @@ export interface TabEventsMap {
|
|
|
22
23
|
};
|
|
23
24
|
[TabEvents.TabUrlChanged]: {
|
|
24
25
|
tabId: string;
|
|
25
|
-
title: string;
|
|
26
|
-
favicon: string;
|
|
27
26
|
oldUrl: string;
|
|
28
27
|
newUrl: string;
|
|
29
|
-
canGoBack: boolean;
|
|
30
|
-
canGoForward: boolean;
|
|
31
28
|
};
|
|
32
29
|
[TabEvents.TabVisibilityChanged]: {
|
|
33
30
|
tabId: string;
|
package/dist/types/tabs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/types/tabs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,QAAQ,EACR,QAAQ,EACR,uBAAuB,EACvB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/types/tabs.ts"],"names":[],"mappings":"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"}
|
package/dist/types/tabs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types/tabs.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/types/tabs.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 type {\n Viewport,\n Protocol,\n PuppeteerLifeCycleEvent,\n ScreenshotOptions,\n} from 'puppeteer-core';\n\nimport type { EnvInfo } from './env';\nimport type { UserAgentInfo } from './browser';\n\nexport interface TabsOptions {\n viewport: Viewport;\n envInfo: EnvInfo;\n userAgentInfo?: UserAgentInfo;\n}\n\nexport interface TabOptions extends TabsOptions {\n tabId: string;\n}\n\nexport const enum TabEvents {\n TabLoadingStateChanged = 'tabLoadingStateChanged',\n TabUrlChanged = 'tabUrlChanged',\n TabVisibilityChanged = 'TabVisibilityChanged',\n TabDialogChanged = 'TabDialogChanged',\n}\n\nexport interface TabEventsMap {\n [TabEvents.TabLoadingStateChanged]: {\n tabId: string;\n isLoading: boolean;\n };\n [TabEvents.TabUrlChanged]: {\n tabId: string;\n
|
|
1
|
+
{"version":3,"file":"types/tabs.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/types/tabs.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 type {\n Viewport,\n Protocol,\n PuppeteerLifeCycleEvent,\n ScreenshotOptions,\n} from 'puppeteer-core';\n\nimport type { EnvInfo } from './env';\nimport type { UserAgentInfo } from './browser';\n\nexport interface TabsOptions {\n viewport: Viewport;\n envInfo: EnvInfo;\n userAgentInfo?: UserAgentInfo;\n}\n\nexport interface TabOptions extends TabsOptions {\n tabId: string;\n injectVisibilityScript?: boolean;\n}\n\nexport const enum TabEvents {\n TabLoadingStateChanged = 'tabLoadingStateChanged',\n TabUrlChanged = 'tabUrlChanged',\n TabVisibilityChanged = 'TabVisibilityChanged',\n TabDialogChanged = 'TabDialogChanged',\n}\n\nexport interface TabEventsMap {\n [TabEvents.TabLoadingStateChanged]: {\n tabId: string;\n isLoading: boolean;\n };\n [TabEvents.TabUrlChanged]: {\n tabId: string;\n oldUrl: string;\n newUrl: string;\n };\n [TabEvents.TabVisibilityChanged]: {\n tabId: string;\n isVisible: boolean;\n };\n [TabEvents.TabDialogChanged]: {\n tabId: string;\n isOpen: boolean;\n type?: Protocol.Page.DialogType;\n message?: string;\n defaultValue?: string;\n };\n}\n\nexport interface DialogMeta {\n type: Protocol.Page.DialogType;\n message: string;\n defaultValue: string;\n}\n\nexport interface TabMeta {\n id: string;\n title: string;\n url: string;\n favicon: string | null;\n isLoading: boolean;\n isActive: boolean;\n canGoBack: boolean;\n canGoForward: boolean;\n dialog?: DialogMeta;\n}\n\nexport interface TabsState {\n tabs: Map<string, TabMeta>;\n activeTabId: string | null;\n}\n\nexport interface TabsOperationTracker {\n creatingTargetIds: Set<string>;\n switchingTargetIds: Set<string>;\n closingTargetIds: Set<string>;\n}\n\nexport interface NavigationOptions {\n waitUntil?: PuppeteerLifeCycleEvent[];\n timeout?: number;\n}\n\nexport interface NavigationSuccessResult {\n success: true;\n url: string;\n}\nexport interface NavigationErrorResult {\n success: false;\n url: string;\n message: string;\n}\n\nexport type NavigationResult = NavigationSuccessResult | NavigationErrorResult;\n\nexport type TabScreenshotOptions = Pick<\n ScreenshotOptions,\n 'type' | 'quality' | 'fullPage' | 'path'\n>;\n\nexport interface BaseScreenshotResult {\n type: string;\n width: number;\n height: number;\n}\n\nexport interface ScreenshotResultWithPath extends BaseScreenshotResult {\n data: Uint8Array;\n}\n\nexport interface ScreenshotResultWithoutPath extends BaseScreenshotResult {\n data: string;\n}\n\nexport type TabScreenshotResult<T extends TabScreenshotOptions> = T extends {\n path: string;\n}\n ? ScreenshotResultWithPath\n : ScreenshotResultWithoutPath;\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","TabEvents"],"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;;;;;;;ACmBO,IAAWI,YAAAA,WAAAA,GAAAA,SAAAA,SAAS;;;;;WAATA"}
|
package/dist/types/tabs.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types/tabs.mjs","sources":["webpack://@agent-infra/browser/./src/types/tabs.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type {\n Viewport,\n Protocol,\n PuppeteerLifeCycleEvent,\n ScreenshotOptions,\n} from 'puppeteer-core';\n\nimport type { EnvInfo } from './env';\nimport type { UserAgentInfo } from './browser';\n\nexport interface TabsOptions {\n viewport: Viewport;\n envInfo: EnvInfo;\n userAgentInfo?: UserAgentInfo;\n}\n\nexport interface TabOptions extends TabsOptions {\n tabId: string;\n}\n\nexport const enum TabEvents {\n TabLoadingStateChanged = 'tabLoadingStateChanged',\n TabUrlChanged = 'tabUrlChanged',\n TabVisibilityChanged = 'TabVisibilityChanged',\n TabDialogChanged = 'TabDialogChanged',\n}\n\nexport interface TabEventsMap {\n [TabEvents.TabLoadingStateChanged]: {\n tabId: string;\n isLoading: boolean;\n };\n [TabEvents.TabUrlChanged]: {\n tabId: string;\n
|
|
1
|
+
{"version":3,"file":"types/tabs.mjs","sources":["webpack://@agent-infra/browser/./src/types/tabs.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type {\n Viewport,\n Protocol,\n PuppeteerLifeCycleEvent,\n ScreenshotOptions,\n} from 'puppeteer-core';\n\nimport type { EnvInfo } from './env';\nimport type { UserAgentInfo } from './browser';\n\nexport interface TabsOptions {\n viewport: Viewport;\n envInfo: EnvInfo;\n userAgentInfo?: UserAgentInfo;\n}\n\nexport interface TabOptions extends TabsOptions {\n tabId: string;\n injectVisibilityScript?: boolean;\n}\n\nexport const enum TabEvents {\n TabLoadingStateChanged = 'tabLoadingStateChanged',\n TabUrlChanged = 'tabUrlChanged',\n TabVisibilityChanged = 'TabVisibilityChanged',\n TabDialogChanged = 'TabDialogChanged',\n}\n\nexport interface TabEventsMap {\n [TabEvents.TabLoadingStateChanged]: {\n tabId: string;\n isLoading: boolean;\n };\n [TabEvents.TabUrlChanged]: {\n tabId: string;\n oldUrl: string;\n newUrl: string;\n };\n [TabEvents.TabVisibilityChanged]: {\n tabId: string;\n isVisible: boolean;\n };\n [TabEvents.TabDialogChanged]: {\n tabId: string;\n isOpen: boolean;\n type?: Protocol.Page.DialogType;\n message?: string;\n defaultValue?: string;\n };\n}\n\nexport interface DialogMeta {\n type: Protocol.Page.DialogType;\n message: string;\n defaultValue: string;\n}\n\nexport interface TabMeta {\n id: string;\n title: string;\n url: string;\n favicon: string | null;\n isLoading: boolean;\n isActive: boolean;\n canGoBack: boolean;\n canGoForward: boolean;\n dialog?: DialogMeta;\n}\n\nexport interface TabsState {\n tabs: Map<string, TabMeta>;\n activeTabId: string | null;\n}\n\nexport interface TabsOperationTracker {\n creatingTargetIds: Set<string>;\n switchingTargetIds: Set<string>;\n closingTargetIds: Set<string>;\n}\n\nexport interface NavigationOptions {\n waitUntil?: PuppeteerLifeCycleEvent[];\n timeout?: number;\n}\n\nexport interface NavigationSuccessResult {\n success: true;\n url: string;\n}\nexport interface NavigationErrorResult {\n success: false;\n url: string;\n message: string;\n}\n\nexport type NavigationResult = NavigationSuccessResult | NavigationErrorResult;\n\nexport type TabScreenshotOptions = Pick<\n ScreenshotOptions,\n 'type' | 'quality' | 'fullPage' | 'path'\n>;\n\nexport interface BaseScreenshotResult {\n type: string;\n width: number;\n height: number;\n}\n\nexport interface ScreenshotResultWithPath extends BaseScreenshotResult {\n data: Uint8Array;\n}\n\nexport interface ScreenshotResultWithoutPath extends BaseScreenshotResult {\n data: string;\n}\n\nexport type TabScreenshotResult<T extends TabScreenshotOptions> = T extends {\n path: string;\n}\n ? ScreenshotResultWithPath\n : ScreenshotResultWithoutPath;\n"],"names":["TabEvents"],"mappings":";;;;AAyBO,IAAWA,iBAASA,WAAAA,GAAAA,SAATA,SAAS;;;;;WAATA"}
|
package/dist/utils/iife.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iife.d.ts","sourceRoot":"","sources":["../../src/utils/iife.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,IAAI,GAAI,QAAQ,MAAM,
|
|
1
|
+
{"version":3,"file":"iife.d.ts","sourceRoot":"","sources":["../../src/utils/iife.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,IAAI,GAAI,QAAQ,MAAM,WAK7B,CAAC"}
|
package/dist/utils/iife.js
CHANGED
|
@@ -31,10 +31,9 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
31
31
|
iife: ()=>iife
|
|
32
32
|
});
|
|
33
33
|
const iife = (script)=>`(() => {
|
|
34
|
-
if (window.
|
|
35
|
-
|
|
34
|
+
if (!window.__agent_infra_browser) {
|
|
35
|
+
window.__agent_infra_browser = {};
|
|
36
36
|
}
|
|
37
|
-
window.__agent_infra_injected_script = true;
|
|
38
37
|
${script}
|
|
39
38
|
})();`;
|
|
40
39
|
exports.iife = __webpack_exports__.iife;
|
package/dist/utils/iife.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils/iife.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/utils/iife.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 */\nexport const iife = (script: string) => /* javascript */ `(() => {\n if (window.
|
|
1
|
+
{"version":3,"file":"utils/iife.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/utils/iife.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 */\nexport const iife = (script: string) => /* javascript */ `(() => {\n if (!window.__agent_infra_browser) {\n window.__agent_infra_browser = {};\n }\n ${script}\n})();`;\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","iife","script"],"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;;;;;;;ACFO,MAAMI,OAAO,CAACC,SAAoC,CAAC;;;;EAIxD,EAAEA,OAAO;KACN,CAAC"}
|
package/dist/utils/iife.mjs
CHANGED
|
@@ -3,10 +3,9 @@
|
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
5
|
const iife = (script)=>`(() => {
|
|
6
|
-
if (window.
|
|
7
|
-
|
|
6
|
+
if (!window.__agent_infra_browser) {
|
|
7
|
+
window.__agent_infra_browser = {};
|
|
8
8
|
}
|
|
9
|
-
window.__agent_infra_injected_script = true;
|
|
10
9
|
${script}
|
|
11
10
|
})();`;
|
|
12
11
|
export { iife };
|
package/dist/utils/iife.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils/iife.mjs","sources":["webpack://@agent-infra/browser/./src/utils/iife.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nexport const iife = (script: string) => /* javascript */ `(() => {\n if (window.
|
|
1
|
+
{"version":3,"file":"utils/iife.mjs","sources":["webpack://@agent-infra/browser/./src/utils/iife.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nexport const iife = (script: string) => /* javascript */ `(() => {\n if (!window.__agent_infra_browser) {\n window.__agent_infra_browser = {};\n }\n ${script}\n})();`;\n"],"names":["iife","script"],"mappings":";;;;AAIO,MAAMA,OAAO,CAACC,SAAoC,CAAC;;;;EAIxD,EAAEA,OAAO;KACN,CAAC"}
|