55
66import type { BeforeSendResponse , BrowserWindow , BrowserWindowConstructorOptions , Event , OnBeforeSendHeadersListenerDetails } from 'electron' ;
77import { Queue , raceTimeout , TimeoutTimer } from '../../../base/common/async.js' ;
8+ import { CancellationTokenSource } from '../../../base/common/cancellation.js' ;
89import { createSingleCallFunction } from '../../../base/common/functional.js' ;
910import { Disposable , toDisposable } from '../../../base/common/lifecycle.js' ;
1011import { URI } from '../../../base/common/uri.js' ;
@@ -27,6 +28,7 @@ export class WebPageLoader extends Disposable {
2728 private static readonly TIMEOUT = 30000 ; // 30 seconds
2829 private static readonly POST_LOAD_TIMEOUT = 5000 ; // 5 seconds - increased for dynamic content
2930 private static readonly FRAME_TIMEOUT = 500 ; // 0.5 seconds
31+ private static readonly EXTRACT_CONTENT_TIMEOUT = 2000 ; // 2 seconds
3032 private static readonly IDLE_DEBOUNCE_TIME = 500 ; // 0.5 seconds - wait after last network request
3133 private static readonly MIN_CONTENT_LENGTH = 100 ; // Minimum content length to consider extraction successful
3234
@@ -329,11 +331,23 @@ export class WebPageLoader extends Disposable {
329331 try {
330332 const title = this . _window . webContents . getTitle ( ) ;
331333
332- let result = await this . extractAccessibilityTreeContent ( ) ?? '' ;
333- if ( result . length < WebPageLoader . MIN_CONTENT_LENGTH ) {
334- this . trace ( `Accessibility tree extraction yielded insufficient content, trying main DOM element extraction` ) ;
335- const domContent = await this . extractMainDomElementContent ( ) ?? '' ;
336- result = domContent . length > result . length ? domContent : result ;
334+ let result = '' ;
335+ const cts = new CancellationTokenSource ( ) ;
336+ try {
337+ await raceTimeout ( ( async ( ) => {
338+ if ( ! cts . token . isCancellationRequested ) {
339+ result = await this . extractAccessibilityTreeContent ( ) ?? '' ;
340+ }
341+
342+ if ( ! cts . token . isCancellationRequested && result . length < WebPageLoader . MIN_CONTENT_LENGTH ) {
343+ this . trace ( `Accessibility tree extraction yielded insufficient content, trying main DOM element extraction` ) ;
344+ const domContent = await this . extractMainDomElementContent ( ) ?? '' ;
345+ result = domContent . length > result . length ? domContent : result ;
346+ }
347+ } ) ( ) , WebPageLoader . EXTRACT_CONTENT_TIMEOUT ) ;
348+ } finally {
349+ cts . cancel ( ) ;
350+ cts . dispose ( ) ;
337351 }
338352
339353 if ( result . length === 0 ) {
0 commit comments