chrome-devtools-mcp-for-extension 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +268 -0
- package/build/node_modules/chrome-devtools-frontend/LICENSE +27 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/App.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/AppProvider.js +17 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Base64.js +43 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/CharacterIdMap.js +27 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Color.js +2029 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ColorConverter.js +330 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ColorUtils.js +221 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Console.js +86 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Debouncer.js +14 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/EventTarget.js +14 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Gzip.js +64 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/JavaScriptMetaData.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Lazy.js +29 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Linkifier.js +34 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/MapWithDefault.js +20 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Mutex.js +49 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Object.js +86 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ParsedURL.js +459 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Progress.js +144 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/QueryParamHandler.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ResolverBase.js +69 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ResourceType.js +506 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ReturnToPanel.js +13 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Revealer.js +159 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Runnable.js +24 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SegmentedRange.js +79 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SettingRegistration.js +164 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Settings.js +1252 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SimpleHistoryManager.js +97 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/StringOutputStream.js +17 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/TextDictionary.js +40 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Throttler.js +71 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Trie.js +127 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Worker.js +44 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/common.js +44 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/AidaClient.js +415 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/GdpClient.js +186 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHost.js +510 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostAPI.js +66 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/Platform.js +59 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/ResourceLoader.js +232 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +957 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/host.js +12 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/i18n/i18n.js +60 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/ArrayUtilities.js +199 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/Brand.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/Constructor.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DOMUtilities.js +122 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DateUtilities.js +13 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DevToolsPath.js +27 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/KeyboardUtilities.js +21 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/MapUtilities.js +79 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/MimeType.js +143 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/NumberUtilities.js +72 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/StringUtilities.js +536 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/Timing.js +9 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/TypedArrayUtilities.js +157 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/TypescriptUtilities.js +24 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/UIString.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/UserVisibleError.js +22 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/platform.js +26 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/InspectorBackend.js +802 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/NodeURL.js +31 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/protocol_client.js +13 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/root/Runtime.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/root/root.js +5 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AccessibilityModel.js +281 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AnimationModel.js +846 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AutofillModel.js +155 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CPUProfilerModel.js +99 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CPUThrottlingManager.js +220 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSContainerQuery.js +98 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSFontFace.js +31 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSLayer.js +22 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +1284 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMedia.js +100 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMetadata.js +1518 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSModel.js +902 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSProperty.js +315 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParser.js +572 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParserMatchers.js +1336 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSQuery.js +53 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSRule.js +361 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSScope.js +22 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStyleDeclaration.js +275 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStyleSheetHeader.js +166 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSSupports.js +24 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CategorizedBreakpoint.js +29 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ChildTargetManager.js +232 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CompilerSourceMappingContentProvider.js +47 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Connections.js +242 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ConsoleModel.js +629 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ConsoleModelTypes.js +14 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Cookie.js +241 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CookieModel.js +198 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CookieParser.js +163 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMDebuggerModel.js +597 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMModel.js +1610 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DebuggerModel.js +1231 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EmulationModel.js +527 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EnhancedTracesParser.js +350 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EventBreakpointsModel.js +125 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/FrameAssociated.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/FrameManager.js +199 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/HeapProfilerModel.js +130 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/HttpReasonPhraseStrings.js +73 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IOModel.js +83 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IsolateManager.js +208 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IssuesModel.js +41 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/LayerTreeBase.js +95 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/LogModel.js +34 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +1916 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +1668 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayColorGenerator.js +48 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayModel.js +765 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayPersistentHighlighter.js +384 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageLoad.js +25 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageResourceLoader.js +300 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PaintProfiler.js +67 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PerformanceMetricsModel.js +62 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PreloadingModel.js +563 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RehydratingConnection.js +286 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RehydratingObject.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RemoteObject.js +905 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Resource.js +163 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ResourceTreeModel.js +922 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RuntimeModel.js +535 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SDKModel.js +45 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ScreenCaptureModel.js +174 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Script.js +395 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SecurityOriginManager.js +54 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerSentEvents.js +67 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerSentEventsProtocol.js +110 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerTiming.js +216 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServiceWorkerCacheModel.js +271 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServiceWorkerManager.js +511 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMap.js +651 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapCache.js +41 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapFunctionRanges.js +132 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapManager.js +189 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopeChainEntry.js +156 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopesInfo.js +276 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/StorageBucketsModel.js +143 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/StorageKeyManager.js +53 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Target.js +262 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TargetManager.js +386 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TraceObject.js +52 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/WebAuthnModel.js +66 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk-meta.js +1117 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk.js +89 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/generated/ARIAProperties.js +1513 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/generated/Deprecation.js +339 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +1561 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +7514 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/generated/protocol.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.js +262 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.js +979 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.js +613 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/UnitFormatters.js +139 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AICallTree.js +372 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AIContext.js +132 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AIQueries.js +105 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CSSWorkspaceBinding.js +243 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CompilerScriptMapping.js +407 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ContentProviderBasedProject.js +130 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/DebuggerLanguagePlugins.js +992 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/DebuggerWorkspaceBinding.js +574 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/DefaultScriptMapping.js +112 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/FileUtils.js +186 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/LiveLocation.js +60 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/NetworkProject.js +107 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/PresentationConsoleMessageHelper.js +244 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceMapping.js +473 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceScriptMapping.js +399 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceUtils.js +87 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/SASSSourceMapping.js +181 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/StylesSourceMapping.js +268 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/TempFile.js +55 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/bindings.js +20 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/CPUProfileDataModel.js +514 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/ProfileTreeModel.js +90 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/cpu_profile.js +6 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/crux-manager/CrUXManager.js +283 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/crux-manager/crux-manager.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/emulation/DeviceModeModel.js +775 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/emulation/EmulatedDevices.js +1706 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/emulation/emulation.js +6 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/formatter/FormatterWorkerPool.js +131 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/formatter/ScriptFormatter.js +77 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/formatter/formatter.js +6 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/geometry/GeometryImpl.js +347 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/geometry/geometry.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/LogManager.js +67 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/NetworkLog.js +494 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/RequestResolver.js +49 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/logs-meta.js +73 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/logs.js +7 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/Calculator.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/NetworkTimeCalculator.js +256 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/RequestTimeRanges.js +120 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/network_time_calculator.js +6 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/NamesResolver.js +626 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/ScopeChainModel.js +59 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/ScopeTreeCache.js +32 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/source_map_scopes.js +7 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/StackTrace.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceImpl.js +67 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceModel.js +97 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/Trie.js +113 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/stack_trace.js +5 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/stack_trace_impl.js +7 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/CodeMirrorUtils.js +32 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/ContentData.js +173 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/ContentProvider.js +30 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/StaticContentProvider.js +32 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/StreamingContentData.js +79 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/Text.js +69 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/TextCursor.js +35 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/TextRange.js +231 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/TextUtils.js +355 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/WasmDisassembly.js +68 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/text_utils.js +14 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/EntityMapper.js +122 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/EventsSerializer.js +81 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/LanternComputationData.js +370 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/ModelImpl.js +166 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Name.js +114 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Processor.js +555 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Styles.js +815 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/FilmStrip.js +44 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/MainThreadActivity.js +76 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/ScriptDuplication.js +162 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/StackTraceForEvent.js +191 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/ThirdParties.js +118 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/TraceFilter.js +50 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/TraceTree.js +592 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/extras.js +10 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AnimationFramesHandler.js +109 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AnimationHandler.js +26 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AsyncJSCallsHandler.js +187 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AuctionWorkletsHandler.js +162 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/DOMStatsHandler.js +21 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ExtensionTraceDataHandler.js +263 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/FlowsHandler.js +148 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/FramesHandler.js +483 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/GPUHandler.js +35 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ImagePaintingHandler.js +147 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/InitiatorsHandler.js +180 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/InvalidationsHandler.js +126 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LargestImagePaintHandler.js +85 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LargestTextPaintHandler.js +27 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LayerTreeHandler.js +103 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LayoutShiftsHandler.js +445 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/MemoryHandler.js +21 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/MetaHandler.js +401 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ModelHandlers.js +33 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/NetworkRequestsHandler.js +540 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/PageFramesHandler.js +42 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/PageLoadMetricsHandler.js +349 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/RendererHandler.js +346 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/SamplesHandler.js +207 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ScreenshotsHandler.js +97 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ScriptsHandler.js +251 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/SelectorStatsHandler.js +71 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/Threads.js +101 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/UserInteractionsHandler.js +317 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/UserTimingsHandler.js +183 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/WarningsHandler.js +134 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/WorkersHandler.js +33 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/handlers.js +7 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/helpers.js +163 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/types.js +1 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Extensions.js +41 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Network.js +102 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/SamplesIntegrator.js +495 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/SyntheticEvents.js +74 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Timing.js +184 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Trace.js +806 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/TreeHelpers.js +254 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/helpers.js +10 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/CLSCulprits.js +488 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Cache.js +208 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Common.js +340 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DOMSize.js +180 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DocumentLatency.js +257 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DuplicatedJavaScript.js +89 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/FontDisplay.js +81 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ForcedReflow.js +160 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/INPBreakdown.js +117 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ImageDelivery.js +262 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPBreakdown.js +188 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPDiscovery.js +182 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LegacyJavaScript.js +88 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Models.js +21 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ModernHTTP.js +199 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/NetworkDependencyTree.js +544 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/RenderBlocking.js +191 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/SlowCSSSelector.js +135 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Statistics.js +92 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ThirdParties.js +97 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Viewport.js +101 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/insights.js +9 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/types.js +18 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/core/LanternError.js +6 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/core/NetworkAnalyzer.js +488 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/core/core.js +5 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/BaseNode.js +276 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/CPUNode.js +63 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/NetworkNode.js +82 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/PageDependencyGraph.js +551 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/graph.js +7 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/lantern.js +9 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/FirstContentfulPaint.js +136 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/Interactive.js +67 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/LargestContentfulPaint.js +68 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/MaxPotentialFID.js +48 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/Metric.js +68 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/SpeedIndex.js +101 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/TBTUtils.js +64 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/TotalBlockingTime.js +78 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/metrics.js +11 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/ConnectionPool.js +115 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/Constants.js +42 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/DNSCache.js +47 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/SimulationTimingMap.js +134 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/Simulator.js +450 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/TCPConnection.js +154 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/simulation.js +9 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/types/Lantern.js +24 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/types/types.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/trace.js +17 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Configuration.js +18 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Extensions.js +37 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/File.js +57 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Overlays.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Timing.js +15 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/TraceEvents.js +574 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/types.js +9 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace_source_maps_resolver/SourceMapsResolver.js +201 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace_source_maps_resolver/trace_source_maps_resolver.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/FileManager.js +64 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/IgnoreListManager.js +511 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/SearchConfig.js +113 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/UISourceCode.js +563 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/WorkspaceImpl.js +204 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/workspace.js +9 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/codemirror.next/codemirror.next.js +1 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/legacy-javascript/LICENSE +202 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/legacy-javascript/legacy-javascript.js +2 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/legacy-javascript/lib/legacy-javascript.js +940 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/LICENSE +26 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/builder/builder.js +196 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/builder/safe_builder.js +226 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/codec.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js +394 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/encode/encode.js +24 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js +283 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/mod.js +7 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/util.js +9 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/vlq.js +84 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/source-map-scopes-codec.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/LICENSE +20 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/lib/nostats-subset.js +146 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/httparchive-nostats-subset.js +2 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/httparchive-subset.js +2 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.js +118 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.test.js +40 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/entities.test.js +26 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/index.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/index.test.js +215 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/subsets/httparchive-nostats.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/subsets/httparchive.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/subsets/nostats.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/nostats-subset.js +2 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/third-party-web.js +2 -0
- package/build/src/McpContext.js +283 -0
- package/build/src/McpResponse.js +223 -0
- package/build/src/Mutex.js +40 -0
- package/build/src/PageCollector.js +68 -0
- package/build/src/WaitForHelper.js +134 -0
- package/build/src/browser.js +493 -0
- package/build/src/cli.js +156 -0
- package/build/src/formatters/consoleFormatter.js +73 -0
- package/build/src/formatters/networkFormatter.js +34 -0
- package/build/src/formatters/snapshotFormatter.js +75 -0
- package/build/src/index.js +13 -0
- package/build/src/logger.js +27 -0
- package/build/src/main.js +139 -0
- package/build/src/system-profile.js +181 -0
- package/build/src/tools/ToolDefinition.js +9 -0
- package/build/src/tools/bookmarks.js +310 -0
- package/build/src/tools/categories.js +15 -0
- package/build/src/tools/console.js +19 -0
- package/build/src/tools/emulation.js +61 -0
- package/build/src/tools/extensions.js +184 -0
- package/build/src/tools/input.js +201 -0
- package/build/src/tools/network.js +77 -0
- package/build/src/tools/pages.js +188 -0
- package/build/src/tools/performance.js +145 -0
- package/build/src/tools/screenshot.js +65 -0
- package/build/src/tools/script.js +57 -0
- package/build/src/tools/snapshot.js +42 -0
- package/build/src/tools/webstore-auto-screenshot.js +159 -0
- package/build/src/tools/webstore-submission.js +332 -0
- package/build/src/trace-processing/parse.js +93 -0
- package/build/src/utils/pagination.js +49 -0
- package/package.json +79 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { logger } from './logger.js';
|
|
2
|
+
export class WaitForHelper {
|
|
3
|
+
#abortController = new AbortController();
|
|
4
|
+
#page;
|
|
5
|
+
#stableDomTimeout;
|
|
6
|
+
#stableDomFor;
|
|
7
|
+
#expectNavigationIn;
|
|
8
|
+
#navigationTimeout;
|
|
9
|
+
constructor(page, cpuTimeoutMultiplier, networkTimeoutMultiplier) {
|
|
10
|
+
this.#stableDomTimeout = 3000 * cpuTimeoutMultiplier;
|
|
11
|
+
this.#stableDomFor = 100 * cpuTimeoutMultiplier;
|
|
12
|
+
this.#expectNavigationIn = 100 * cpuTimeoutMultiplier;
|
|
13
|
+
this.#navigationTimeout = 3000 * networkTimeoutMultiplier;
|
|
14
|
+
this.#page = page;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A wrapper that executes a action and waits for
|
|
18
|
+
* a potential navigation, after which it waits
|
|
19
|
+
* for the DOM to be stable before returning.
|
|
20
|
+
*/
|
|
21
|
+
async waitForStableDom() {
|
|
22
|
+
const stableDomObserver = await this.#page.evaluateHandle(timeout => {
|
|
23
|
+
let timeoutId;
|
|
24
|
+
function callback() {
|
|
25
|
+
clearTimeout(timeoutId);
|
|
26
|
+
timeoutId = setTimeout(() => {
|
|
27
|
+
domObserver.resolver.resolve();
|
|
28
|
+
domObserver.observer.disconnect();
|
|
29
|
+
}, timeout);
|
|
30
|
+
}
|
|
31
|
+
const domObserver = {
|
|
32
|
+
resolver: Promise.withResolvers(),
|
|
33
|
+
observer: new MutationObserver(callback),
|
|
34
|
+
};
|
|
35
|
+
// It's possible that the DOM is not gonna change so we
|
|
36
|
+
// need to start the timeout initially.
|
|
37
|
+
callback();
|
|
38
|
+
domObserver.observer.observe(document.body, {
|
|
39
|
+
childList: true,
|
|
40
|
+
subtree: true,
|
|
41
|
+
attributes: true,
|
|
42
|
+
});
|
|
43
|
+
return domObserver;
|
|
44
|
+
}, this.#stableDomFor);
|
|
45
|
+
this.#abortController.signal.addEventListener('abort', async () => {
|
|
46
|
+
try {
|
|
47
|
+
await stableDomObserver.evaluate(observer => {
|
|
48
|
+
observer.observer.disconnect();
|
|
49
|
+
observer.resolver.resolve();
|
|
50
|
+
});
|
|
51
|
+
await stableDomObserver.dispose();
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Ignored cleanup errors
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
return Promise.race([
|
|
58
|
+
stableDomObserver.evaluate(async (observer) => {
|
|
59
|
+
return await observer.resolver.promise;
|
|
60
|
+
}),
|
|
61
|
+
this.timeout(this.#stableDomTimeout).then(() => {
|
|
62
|
+
throw new Error('Timeout');
|
|
63
|
+
}),
|
|
64
|
+
]);
|
|
65
|
+
}
|
|
66
|
+
async waitForNavigationStarted() {
|
|
67
|
+
// Currently Puppeteer does not have API
|
|
68
|
+
// For when a navigation is about to start
|
|
69
|
+
const navigationStartedPromise = new Promise(resolve => {
|
|
70
|
+
const listener = (event) => {
|
|
71
|
+
if ([
|
|
72
|
+
'historySameDocument',
|
|
73
|
+
'historyDifferentDocument',
|
|
74
|
+
'sameDocument',
|
|
75
|
+
].includes(event.navigationType)) {
|
|
76
|
+
resolve(false);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
resolve(true);
|
|
80
|
+
};
|
|
81
|
+
this.#page._client().on('Page.frameStartedNavigating', listener);
|
|
82
|
+
this.#abortController.signal.addEventListener('abort', () => {
|
|
83
|
+
resolve(false);
|
|
84
|
+
this.#page._client().off('Page.frameStartedNavigating', listener);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
return await Promise.race([
|
|
88
|
+
navigationStartedPromise,
|
|
89
|
+
this.timeout(this.#expectNavigationIn).then(() => false),
|
|
90
|
+
]);
|
|
91
|
+
}
|
|
92
|
+
timeout(time) {
|
|
93
|
+
return new Promise(res => {
|
|
94
|
+
const id = setTimeout(res, time);
|
|
95
|
+
this.#abortController.signal.addEventListener('abort', () => {
|
|
96
|
+
res();
|
|
97
|
+
clearTimeout(id);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
async waitForEventsAfterAction(action) {
|
|
102
|
+
const navigationFinished = this.waitForNavigationStarted()
|
|
103
|
+
.then(navigationStated => {
|
|
104
|
+
if (navigationStated) {
|
|
105
|
+
return this.#page.waitForNavigation({
|
|
106
|
+
timeout: this.#navigationTimeout,
|
|
107
|
+
signal: this.#abortController.signal,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return;
|
|
111
|
+
})
|
|
112
|
+
.catch(error => logger(error));
|
|
113
|
+
try {
|
|
114
|
+
await action();
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
// Clear up pending promises
|
|
118
|
+
this.#abortController.abort();
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
await navigationFinished;
|
|
123
|
+
// Wait for stable dom after navigation so we execute in
|
|
124
|
+
// the correct context
|
|
125
|
+
await this.waitForStableDom();
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
logger(error);
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
this.#abortController.abort();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
import { promises as fsPromises } from 'node:fs';
|
|
8
|
+
import os from 'node:os';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
import puppeteer from 'puppeteer-core';
|
|
11
|
+
import { detectSystemChromeProfile, detectAnySystemChromeProfile, } from './system-profile.js';
|
|
12
|
+
let browser;
|
|
13
|
+
const ignoredPrefixes = new Set([
|
|
14
|
+
'chrome://',
|
|
15
|
+
'chrome-extension://',
|
|
16
|
+
'chrome-untrusted://',
|
|
17
|
+
'devtools://',
|
|
18
|
+
]);
|
|
19
|
+
function targetFilter(target) {
|
|
20
|
+
if (target.url() === 'chrome://newtab/') {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
for (const prefix of ignoredPrefixes) {
|
|
24
|
+
if (target.url().startsWith(prefix)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
const connectOptions = {
|
|
31
|
+
targetFilter,
|
|
32
|
+
// We do not expect any single CDP command to take more than 10sec.
|
|
33
|
+
protocolTimeout: 10_000,
|
|
34
|
+
};
|
|
35
|
+
async function ensureBrowserConnected(browserURL) {
|
|
36
|
+
if (browser?.connected) {
|
|
37
|
+
return browser;
|
|
38
|
+
}
|
|
39
|
+
browser = await puppeteer.connect({
|
|
40
|
+
...connectOptions,
|
|
41
|
+
browserURL,
|
|
42
|
+
defaultViewport: null,
|
|
43
|
+
});
|
|
44
|
+
return browser;
|
|
45
|
+
}
|
|
46
|
+
function scanExtensionsDirectory(extensionsDir) {
|
|
47
|
+
const extensionPaths = [];
|
|
48
|
+
try {
|
|
49
|
+
if (!fs.existsSync(extensionsDir)) {
|
|
50
|
+
console.warn(`Extensions directory not found: ${extensionsDir}`);
|
|
51
|
+
return extensionPaths;
|
|
52
|
+
}
|
|
53
|
+
const entries = fs.readdirSync(extensionsDir, { withFileTypes: true });
|
|
54
|
+
for (const entry of entries) {
|
|
55
|
+
if (entry.isDirectory()) {
|
|
56
|
+
const extensionPath = path.join(extensionsDir, entry.name);
|
|
57
|
+
const manifestPath = path.join(extensionPath, 'manifest.json');
|
|
58
|
+
// First, check if manifest.json exists in the root directory
|
|
59
|
+
if (fs.existsSync(manifestPath)) {
|
|
60
|
+
try {
|
|
61
|
+
const manifestContent = fs.readFileSync(manifestPath, 'utf-8');
|
|
62
|
+
const manifest = JSON.parse(manifestContent);
|
|
63
|
+
if (manifest.manifest_version) {
|
|
64
|
+
extensionPaths.push(extensionPath);
|
|
65
|
+
console.error(`Found extension: ${entry.name} (v${manifest.version || 'unknown'})`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.warn(`Invalid manifest.json in ${entry.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// If not found in root, check common subdirectories
|
|
74
|
+
const subDirs = ['extension', 'dist', 'dist-simple', 'build', 'src'];
|
|
75
|
+
for (const subDir of subDirs) {
|
|
76
|
+
const subPath = path.join(extensionPath, subDir);
|
|
77
|
+
const subManifestPath = path.join(subPath, 'manifest.json');
|
|
78
|
+
if (fs.existsSync(subManifestPath)) {
|
|
79
|
+
try {
|
|
80
|
+
const manifestContent = fs.readFileSync(subManifestPath, 'utf-8');
|
|
81
|
+
const manifest = JSON.parse(manifestContent);
|
|
82
|
+
if (manifest.manifest_version) {
|
|
83
|
+
extensionPaths.push(subPath);
|
|
84
|
+
console.error(`Found extension: ${entry.name}/${subDir} (v${manifest.version || 'unknown'})`);
|
|
85
|
+
break; // Use the first valid subdirectory found
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
console.warn(`Invalid manifest.json in ${entry.name}/${subDir}: ${error instanceof Error ? error.message : String(error)}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
console.error(`Scanned ${extensionsDir}: found ${extensionPaths.length} valid extensions`);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
console.error(`Error scanning extensions directory ${extensionsDir}: ${error instanceof Error ? error.message : String(error)}`);
|
|
100
|
+
}
|
|
101
|
+
return extensionPaths;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get the Chrome extensions directory path for the current platform
|
|
105
|
+
*/
|
|
106
|
+
function getChromeExtensionsDirectory(channel) {
|
|
107
|
+
const homeDir = os.homedir();
|
|
108
|
+
const platform = os.platform();
|
|
109
|
+
let chromeDataPath;
|
|
110
|
+
let profileName = 'Default';
|
|
111
|
+
if (platform === 'darwin') {
|
|
112
|
+
// macOS
|
|
113
|
+
chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome');
|
|
114
|
+
if (channel === 'canary') {
|
|
115
|
+
chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome Canary');
|
|
116
|
+
}
|
|
117
|
+
else if (channel === 'beta') {
|
|
118
|
+
chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome Beta');
|
|
119
|
+
}
|
|
120
|
+
else if (channel === 'dev') {
|
|
121
|
+
chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome Dev');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else if (platform === 'win32') {
|
|
125
|
+
// Windows
|
|
126
|
+
chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome', 'User Data');
|
|
127
|
+
if (channel === 'canary') {
|
|
128
|
+
chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome SxS', 'User Data');
|
|
129
|
+
}
|
|
130
|
+
else if (channel === 'beta') {
|
|
131
|
+
chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome Beta', 'User Data');
|
|
132
|
+
}
|
|
133
|
+
else if (channel === 'dev') {
|
|
134
|
+
chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome Dev', 'User Data');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
// Linux
|
|
139
|
+
chromeDataPath = path.join(homeDir, '.config', 'google-chrome');
|
|
140
|
+
if (channel === 'canary') {
|
|
141
|
+
chromeDataPath = path.join(homeDir, '.config', 'google-chrome-unstable');
|
|
142
|
+
}
|
|
143
|
+
else if (channel === 'beta') {
|
|
144
|
+
chromeDataPath = path.join(homeDir, '.config', 'google-chrome-beta');
|
|
145
|
+
}
|
|
146
|
+
else if (channel === 'dev') {
|
|
147
|
+
chromeDataPath = path.join(homeDir, '.config', 'google-chrome-unstable');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return path.join(chromeDataPath, profileName, 'Extensions');
|
|
151
|
+
}
|
|
152
|
+
function validateExtensionManifest(manifestPath) {
|
|
153
|
+
try {
|
|
154
|
+
if (!fs.existsSync(manifestPath)) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
const manifestContent = fs.readFileSync(manifestPath, 'utf-8');
|
|
158
|
+
const manifest = JSON.parse(manifestContent);
|
|
159
|
+
// Basic validation
|
|
160
|
+
if (!manifest.manifest_version || !manifest.name || !manifest.version) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
// Ensure it's a valid manifest version (2 or 3)
|
|
164
|
+
if (manifest.manifest_version !== 2 && manifest.manifest_version !== 3) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
return manifest;
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
console.warn(`Invalid manifest.json at ${manifestPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Discover Chrome extensions installed in the system
|
|
176
|
+
*/
|
|
177
|
+
function discoverSystemExtensions(channel) {
|
|
178
|
+
const extensionPaths = [];
|
|
179
|
+
const extensionsDir = getChromeExtensionsDirectory(channel);
|
|
180
|
+
console.error(`🔍 Discovering system Chrome extensions in: ${extensionsDir}`);
|
|
181
|
+
try {
|
|
182
|
+
if (!fs.existsSync(extensionsDir)) {
|
|
183
|
+
console.warn(`System Chrome extensions directory not found: ${extensionsDir}`);
|
|
184
|
+
return extensionPaths;
|
|
185
|
+
}
|
|
186
|
+
const extensionIds = fs.readdirSync(extensionsDir, { withFileTypes: true });
|
|
187
|
+
for (const extensionEntry of extensionIds) {
|
|
188
|
+
if (!extensionEntry.isDirectory())
|
|
189
|
+
continue;
|
|
190
|
+
const extensionIdPath = path.join(extensionsDir, extensionEntry.name);
|
|
191
|
+
try {
|
|
192
|
+
// Each extension ID directory contains version subdirectories
|
|
193
|
+
const versions = fs.readdirSync(extensionIdPath, { withFileTypes: true });
|
|
194
|
+
// Find the latest/most recent version
|
|
195
|
+
let latestVersion = '';
|
|
196
|
+
let latestPath = '';
|
|
197
|
+
for (const versionEntry of versions) {
|
|
198
|
+
if (!versionEntry.isDirectory())
|
|
199
|
+
continue;
|
|
200
|
+
const versionPath = path.join(extensionIdPath, versionEntry.name);
|
|
201
|
+
const manifestPath = path.join(versionPath, 'manifest.json');
|
|
202
|
+
const manifest = validateExtensionManifest(manifestPath);
|
|
203
|
+
if (manifest) {
|
|
204
|
+
// Use the first valid version found (Chrome keeps the latest active)
|
|
205
|
+
if (!latestVersion || versionEntry.name > latestVersion) {
|
|
206
|
+
latestVersion = versionEntry.name;
|
|
207
|
+
latestPath = versionPath;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (latestPath && latestVersion) {
|
|
212
|
+
const manifest = validateExtensionManifest(path.join(latestPath, 'manifest.json'));
|
|
213
|
+
if (manifest) {
|
|
214
|
+
extensionPaths.push(latestPath);
|
|
215
|
+
console.error(` ✅ Found: ${manifest.name} v${manifest.version} (Manifest v${manifest.manifest_version})`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
console.warn(`Error processing extension ${extensionEntry.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
console.error(`📦 System extension discovery complete: ${extensionPaths.length} valid extensions found`);
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
console.error(`Error discovering system extensions: ${error instanceof Error ? error.message : String(error)}`);
|
|
227
|
+
}
|
|
228
|
+
return extensionPaths;
|
|
229
|
+
}
|
|
230
|
+
export async function launch(options) {
|
|
231
|
+
const { channel, executablePath, customDevTools, headless, isolated, loadExtension, loadExtensionsDir, loadSystemExtensions, } = options;
|
|
232
|
+
const profileDirName = channel && channel !== 'stable'
|
|
233
|
+
? `chrome-profile-${channel}`
|
|
234
|
+
: 'chrome-profile';
|
|
235
|
+
let userDataDir = options.userDataDir;
|
|
236
|
+
let usingSystemProfile = false;
|
|
237
|
+
if (!isolated && !userDataDir) {
|
|
238
|
+
// Try to use system Chrome profile directly
|
|
239
|
+
const systemProfile = detectSystemChromeProfile(channel) || detectAnySystemChromeProfile();
|
|
240
|
+
if (systemProfile) {
|
|
241
|
+
// Use system profile directly for better user experience
|
|
242
|
+
userDataDir = systemProfile.path;
|
|
243
|
+
usingSystemProfile = true;
|
|
244
|
+
console.error(`✅ Using system Chrome profile: ${systemProfile.channel}`);
|
|
245
|
+
console.error(` Path: ${userDataDir}`);
|
|
246
|
+
console.error(` ⚠️ Note: Close regular Chrome if you encounter issues`);
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
// Fallback to isolated profile if no system Chrome found
|
|
250
|
+
userDataDir = path.join(os.homedir(), '.cache', 'chrome-devtools-mcp', profileDirName);
|
|
251
|
+
await fs.promises.mkdir(userDataDir, {
|
|
252
|
+
recursive: true,
|
|
253
|
+
});
|
|
254
|
+
console.error(`📁 Using isolated profile (no system Chrome found)`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const args = [
|
|
258
|
+
'--hide-crash-restore-bubble',
|
|
259
|
+
'--profile-directory=Default', // Ensure we use the Default profile
|
|
260
|
+
];
|
|
261
|
+
if (customDevTools) {
|
|
262
|
+
args.push(`--custom-devtools-frontend=file://${customDevTools}`);
|
|
263
|
+
}
|
|
264
|
+
// Collect all extension paths
|
|
265
|
+
const extensionPaths = [];
|
|
266
|
+
if (loadExtension) {
|
|
267
|
+
// Validate single extension path
|
|
268
|
+
if (fs.existsSync(loadExtension)) {
|
|
269
|
+
const manifestPath = path.join(loadExtension, 'manifest.json');
|
|
270
|
+
if (fs.existsSync(manifestPath)) {
|
|
271
|
+
try {
|
|
272
|
+
const manifestContent = fs.readFileSync(manifestPath, 'utf-8');
|
|
273
|
+
const manifest = JSON.parse(manifestContent);
|
|
274
|
+
if (manifest.manifest_version) {
|
|
275
|
+
extensionPaths.push(loadExtension);
|
|
276
|
+
console.error(`✅ Single extension validated: ${loadExtension}`);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
console.error(`❌ Invalid manifest.json in ${loadExtension}: missing manifest_version`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
console.error(`❌ Invalid manifest.json in ${loadExtension}: ${error instanceof Error ? error.message : String(error)}`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
console.error(`❌ Extension path missing manifest.json: ${loadExtension}`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
console.error(`❌ Extension path does not exist: ${loadExtension}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (loadExtensionsDir) {
|
|
295
|
+
const scannedExtensions = scanExtensionsDirectory(loadExtensionsDir);
|
|
296
|
+
extensionPaths.push(...scannedExtensions);
|
|
297
|
+
}
|
|
298
|
+
// System extension discovery
|
|
299
|
+
if (loadSystemExtensions) {
|
|
300
|
+
const systemExtensions = discoverSystemExtensions(channel);
|
|
301
|
+
if (systemExtensions.length > 0) {
|
|
302
|
+
extensionPaths.push(...systemExtensions);
|
|
303
|
+
console.error(`🔗 Integrated ${systemExtensions.length} system extensions with development extensions`);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
console.warn(`⚠️ No system extensions found or accessible`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (extensionPaths.length > 0) {
|
|
310
|
+
args.push(`--load-extension=${extensionPaths.join(',')}`);
|
|
311
|
+
args.push('--enable-experimental-extension-apis');
|
|
312
|
+
// Fix for Chrome 137+ where --load-extension is disabled by default
|
|
313
|
+
args.push('--disable-features=DisableLoadExtensionCommandLineSwitch');
|
|
314
|
+
console.error(`Loading ${extensionPaths.length} Chrome extension(s):`);
|
|
315
|
+
extensionPaths.forEach((path, index) => {
|
|
316
|
+
console.error(` ${index + 1}. ${path}`);
|
|
317
|
+
});
|
|
318
|
+
console.error(`Chrome args will include: --load-extension=${extensionPaths.join(',')}`);
|
|
319
|
+
console.error('Applied Chrome 137+ extension loading fix');
|
|
320
|
+
}
|
|
321
|
+
// Add Google login automation detection bypass
|
|
322
|
+
args.push('--disable-blink-features=AutomationControlled');
|
|
323
|
+
console.error('Added Google login bypass: --disable-blink-features=AutomationControlled');
|
|
324
|
+
let puppeterChannel;
|
|
325
|
+
if (!executablePath) {
|
|
326
|
+
puppeterChannel =
|
|
327
|
+
channel && channel !== 'stable'
|
|
328
|
+
? `chrome-${channel}`
|
|
329
|
+
: 'chrome';
|
|
330
|
+
}
|
|
331
|
+
// Log complete Chrome configuration before launch
|
|
332
|
+
console.error('Chrome Launch Configuration:');
|
|
333
|
+
console.error(` Channel: ${puppeterChannel || 'default'}`);
|
|
334
|
+
console.error(` Executable: ${executablePath || 'auto-detected'}`);
|
|
335
|
+
console.error(` User Data Dir: ${userDataDir || 'temporary'}`);
|
|
336
|
+
console.error(` Profile Type: ${usingSystemProfile ? 'System Profile (auto-detected)' : 'Custom Profile'}`);
|
|
337
|
+
console.error(` Headless: ${headless}`);
|
|
338
|
+
console.error(` Args: ${JSON.stringify(args, null, 2)}`);
|
|
339
|
+
console.error(` Ignored Default Args: ${extensionPaths.length > 0 ? '["--disable-extensions"]' : 'none'}`);
|
|
340
|
+
try {
|
|
341
|
+
const browser = await puppeteer.launch({
|
|
342
|
+
...connectOptions,
|
|
343
|
+
channel: puppeterChannel,
|
|
344
|
+
executablePath,
|
|
345
|
+
defaultViewport: null,
|
|
346
|
+
userDataDir,
|
|
347
|
+
pipe: true,
|
|
348
|
+
headless,
|
|
349
|
+
args,
|
|
350
|
+
ignoreDefaultArgs: extensionPaths.length > 0 ? ['--disable-extensions', '--enable-automation'] : ['--enable-automation'],
|
|
351
|
+
});
|
|
352
|
+
if (options.logFile) {
|
|
353
|
+
// FIXME: we are probably subscribing too late to catch startup logs. We
|
|
354
|
+
// should expose the process earlier or expose the getRecentLogs() getter.
|
|
355
|
+
browser.process()?.stderr?.pipe(options.logFile);
|
|
356
|
+
browser.process()?.stdout?.pipe(options.logFile);
|
|
357
|
+
}
|
|
358
|
+
// Apply Google login automation detection bypass to all pages
|
|
359
|
+
browser.on('targetcreated', async (target) => {
|
|
360
|
+
if (target.type() === 'page') {
|
|
361
|
+
try {
|
|
362
|
+
const page = await target.page();
|
|
363
|
+
if (page) {
|
|
364
|
+
await page.evaluateOnNewDocument(() => {
|
|
365
|
+
Object.defineProperty(window.navigator, 'webdriver', {
|
|
366
|
+
get: () => undefined,
|
|
367
|
+
configurable: true
|
|
368
|
+
});
|
|
369
|
+
});
|
|
370
|
+
console.error('Applied navigator.webdriver bypass to new page');
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
catch (error) {
|
|
374
|
+
console.error('Failed to apply webdriver bypass:', error);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
// Apply bypass to existing pages
|
|
379
|
+
const initialPages = await browser.pages();
|
|
380
|
+
for (const page of initialPages) {
|
|
381
|
+
await page.evaluateOnNewDocument(() => {
|
|
382
|
+
Object.defineProperty(window.navigator, 'webdriver', {
|
|
383
|
+
get: () => undefined,
|
|
384
|
+
configurable: true
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
console.error('Applied navigator.webdriver bypass to existing page');
|
|
388
|
+
}
|
|
389
|
+
// Verify extensions were loaded by checking chrome://extensions/
|
|
390
|
+
if (extensionPaths.length > 0) {
|
|
391
|
+
console.error('🔍 Verifying extension loading...');
|
|
392
|
+
try {
|
|
393
|
+
const pages = await browser.pages();
|
|
394
|
+
const page = pages[0] || await browser.newPage();
|
|
395
|
+
// Add a small delay to ensure Chrome is fully started
|
|
396
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
397
|
+
await page.goto('chrome://extensions/', { waitUntil: 'networkidle0' });
|
|
398
|
+
const loadedExtensions = await page.evaluate(() => {
|
|
399
|
+
const extensionCards = document.querySelectorAll('extensions-item');
|
|
400
|
+
const results = [];
|
|
401
|
+
Array.from(extensionCards).forEach(card => {
|
|
402
|
+
const shadowRoot = card.shadowRoot;
|
|
403
|
+
if (shadowRoot) {
|
|
404
|
+
const name = shadowRoot.querySelector('#name')?.textContent?.trim() || 'Unknown';
|
|
405
|
+
const enabled = !shadowRoot.querySelector('#enable-toggle')?.hasAttribute('disabled');
|
|
406
|
+
const id = card.getAttribute('id') || 'unknown';
|
|
407
|
+
results.push({ name, id, enabled });
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
return results;
|
|
411
|
+
});
|
|
412
|
+
console.error(`✅ Extensions verification complete. Found ${loadedExtensions.length} extensions:`);
|
|
413
|
+
loadedExtensions.forEach((ext, index) => {
|
|
414
|
+
console.error(` ${index + 1}. ${ext.name} (${ext.enabled ? 'enabled' : 'disabled'}) - ID: ${ext.id}`);
|
|
415
|
+
});
|
|
416
|
+
if (loadedExtensions.length === 0) {
|
|
417
|
+
console.error('⚠️ No extensions found in chrome://extensions/ - this may indicate loading failure');
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
catch (verificationError) {
|
|
421
|
+
console.error(`⚠️ Extension verification failed: ${verificationError}`);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
return browser;
|
|
425
|
+
}
|
|
426
|
+
catch (error) {
|
|
427
|
+
// When system profile is already in use, create a minimal copy for automation
|
|
428
|
+
if (usingSystemProfile &&
|
|
429
|
+
(error.message.includes('The browser is already running') ||
|
|
430
|
+
error.message.includes('Target closed') ||
|
|
431
|
+
error.message.includes('Connection closed'))) {
|
|
432
|
+
console.error(`⚠️ Chrome is already running with system profile.`);
|
|
433
|
+
console.error(`📋 Creating a temporary copy of system profile for automation...`);
|
|
434
|
+
// Create a temporary copy of the system profile
|
|
435
|
+
const tempProfileDir = path.join(os.tmpdir(), `chrome-mcp-${Date.now()}`);
|
|
436
|
+
try {
|
|
437
|
+
// Copy only essential data (bookmarks, extensions) without locking files
|
|
438
|
+
await fsPromises.mkdir(tempProfileDir, { recursive: true });
|
|
439
|
+
// Copy bookmarks if they exist
|
|
440
|
+
const bookmarksPath = path.join(userDataDir, 'Default', 'Bookmarks');
|
|
441
|
+
try {
|
|
442
|
+
await fsPromises.access(bookmarksPath);
|
|
443
|
+
const bookmarksDestDir = path.join(tempProfileDir, 'Default');
|
|
444
|
+
await fsPromises.mkdir(bookmarksDestDir, { recursive: true });
|
|
445
|
+
await fsPromises.copyFile(bookmarksPath, path.join(bookmarksDestDir, 'Bookmarks'));
|
|
446
|
+
console.error(`✅ Bookmarks copied from system profile`);
|
|
447
|
+
}
|
|
448
|
+
catch {
|
|
449
|
+
// Bookmarks don't exist or can't be accessed, skip
|
|
450
|
+
}
|
|
451
|
+
// Retry with the temporary profile by recursively calling launch
|
|
452
|
+
console.error(`🔄 Retrying with temporary profile copy...`);
|
|
453
|
+
const retryOptions = { ...options };
|
|
454
|
+
retryOptions.userDataDir = tempProfileDir;
|
|
455
|
+
return launch(retryOptions);
|
|
456
|
+
}
|
|
457
|
+
catch (copyError) {
|
|
458
|
+
console.error(`❌ Failed to create temporary profile copy: ${copyError}`);
|
|
459
|
+
// Fall through to regular error handling
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
// For non-system profiles, maintain the blocking behavior
|
|
463
|
+
if (!usingSystemProfile &&
|
|
464
|
+
userDataDir &&
|
|
465
|
+
(error.message.includes('The browser is already running') ||
|
|
466
|
+
error.message.includes('Target closed') ||
|
|
467
|
+
error.message.includes('Connection closed'))) {
|
|
468
|
+
throw new Error(`The browser is already running for custom profile: ${userDataDir}. Use --isolated to run multiple browser instances.`, {
|
|
469
|
+
cause: error,
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
// If system profile failed for other reasons, suggest fallback options
|
|
473
|
+
if (usingSystemProfile) {
|
|
474
|
+
console.error(`❌ Failed to launch Chrome with system profile: ${userDataDir}`);
|
|
475
|
+
console.error(`💡 Suggestion: Try with --isolated flag for temporary profile, or --userDataDir to specify custom location`);
|
|
476
|
+
}
|
|
477
|
+
throw error;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
async function ensureBrowserLaunched(options) {
|
|
481
|
+
if (browser?.connected) {
|
|
482
|
+
return browser;
|
|
483
|
+
}
|
|
484
|
+
browser = await launch(options);
|
|
485
|
+
return browser;
|
|
486
|
+
}
|
|
487
|
+
export async function resolveBrowser(options) {
|
|
488
|
+
const browser = options.browserUrl
|
|
489
|
+
? await ensureBrowserConnected(options.browserUrl)
|
|
490
|
+
: await ensureBrowserLaunched(options);
|
|
491
|
+
return browser;
|
|
492
|
+
}
|
|
493
|
+
export { scanExtensionsDirectory, discoverSystemExtensions, getChromeExtensionsDirectory, validateExtensionManifest };
|