@opensteer/engine-abp 0.8.3 → 0.8.4

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/index.cjs CHANGED
@@ -1279,19 +1279,24 @@ function normalizePostLoadTrackerState(value) {
1279
1279
  const installedAt = readFiniteNumber(value.installedAt);
1280
1280
  const lastMutationAt = readFiniteNumber(value.lastMutationAt);
1281
1281
  const lastNetworkActivityAt = readFiniteNumber(value.lastNetworkActivityAt);
1282
+ const lastTrackedNetworkActivityAt = readFiniteNumber(value.lastTrackedNetworkActivityAt);
1282
1283
  const now = readFiniteNumber(value.now);
1283
1284
  const readyState = typeof value.readyState === "string" ? value.readyState : void 0;
1284
- if (installedAt === void 0 || lastMutationAt === void 0 || lastNetworkActivityAt === void 0 || now === void 0 || readyState === void 0) {
1285
+ if (installedAt === void 0 || lastMutationAt === void 0 || lastNetworkActivityAt === void 0 || lastTrackedNetworkActivityAt === void 0 || now === void 0 || readyState === void 0) {
1285
1286
  return void 0;
1286
1287
  }
1287
1288
  return {
1288
1289
  installedAt,
1289
1290
  lastMutationAt,
1290
1291
  lastNetworkActivityAt,
1292
+ lastTrackedNetworkActivityAt,
1291
1293
  now,
1292
1294
  pendingFetches: readNonNegativeNumber(value.pendingFetches),
1293
1295
  pendingTimeouts: readNonNegativeNumber(value.pendingTimeouts),
1294
1296
  pendingXhrs: readNonNegativeNumber(value.pendingXhrs),
1297
+ trackedPendingFetches: readNonNegativeNumber(value.trackedPendingFetches),
1298
+ trackedPendingXhrs: readNonNegativeNumber(value.trackedPendingXhrs),
1299
+ collecting: value.collecting === true,
1295
1300
  readyState
1296
1301
  };
1297
1302
  }
@@ -1306,11 +1311,14 @@ function buildPostLoadTrackerInstallScript() {
1306
1311
  installedAt: performance.now(),
1307
1312
  lastMutationAt: performance.now(),
1308
1313
  lastNetworkActivityAt: performance.now(),
1314
+ lastTrackedNetworkActivityAt: performance.now(),
1309
1315
  pendingFetches: 0,
1310
1316
  pendingTimeouts: 0,
1311
1317
  pendingXhrs: 0,
1318
+ trackedPendingFetches: 0,
1319
+ trackedPendingXhrs: 0,
1320
+ collecting: true,
1312
1321
  readyState: document.readyState,
1313
- timeoutIds: new Set(),
1314
1322
  };
1315
1323
  globalObject.__opensteerActionBoundaryTrackerInstalled = true;
1316
1324
  globalObject.__opensteerActionBoundaryTracker = tracker;
@@ -1323,6 +1331,18 @@ function buildPostLoadTrackerInstallScript() {
1323
1331
  tracker.lastNetworkActivityAt = performance.now();
1324
1332
  tracker.readyState = document.readyState;
1325
1333
  };
1334
+ const markTrackedNetwork = () => {
1335
+ tracker.lastTrackedNetworkActivityAt = performance.now();
1336
+ markNetwork();
1337
+ };
1338
+ const resetTracking = () => {
1339
+ const now = performance.now();
1340
+ tracker.lastTrackedNetworkActivityAt = now;
1341
+ tracker.trackedPendingFetches = 0;
1342
+ tracker.trackedPendingXhrs = 0;
1343
+ tracker.collecting = true;
1344
+ tracker.readyState = document.readyState;
1345
+ };
1326
1346
 
1327
1347
  const startObserver = () => {
1328
1348
  const target = document.documentElement ?? document;
@@ -1348,45 +1368,26 @@ function buildPostLoadTrackerInstallScript() {
1348
1368
  document.addEventListener("readystatechange", markMutation);
1349
1369
  addEventListener("load", markMutation, { once: true });
1350
1370
 
1351
- const nativeSetTimeout = globalObject.setTimeout.bind(globalObject);
1352
- const nativeClearTimeout = globalObject.clearTimeout.bind(globalObject);
1353
- globalObject.setTimeout = function(callback, delay, ...args) {
1354
- tracker.pendingTimeouts += 1;
1355
- markNetwork();
1356
- let handle;
1357
- const wrapped =
1358
- typeof callback === "function"
1359
- ? (...callbackArgs) => {
1360
- if (tracker.timeoutIds.delete(handle)) {
1361
- tracker.pendingTimeouts = Math.max(0, tracker.pendingTimeouts - 1);
1362
- }
1363
- try {
1364
- return callback(...callbackArgs);
1365
- } finally {
1366
- markMutation();
1367
- }
1368
- }
1369
- : callback;
1370
- handle = nativeSetTimeout(wrapped, delay, ...args);
1371
- tracker.timeoutIds.add(handle);
1372
- return handle;
1373
- };
1374
- globalObject.clearTimeout = function(handle) {
1375
- if (tracker.timeoutIds.delete(handle)) {
1376
- tracker.pendingTimeouts = Math.max(0, tracker.pendingTimeouts - 1);
1377
- }
1378
- return nativeClearTimeout(handle);
1379
- };
1380
-
1381
1371
  if (typeof globalObject.fetch === "function") {
1382
1372
  const nativeFetch = globalObject.fetch.bind(globalObject);
1383
1373
  globalObject.fetch = (...args) => {
1374
+ const tracked = tracker.collecting === true;
1384
1375
  tracker.pendingFetches += 1;
1385
- markNetwork();
1376
+ if (tracked) {
1377
+ tracker.trackedPendingFetches += 1;
1378
+ markTrackedNetwork();
1379
+ } else {
1380
+ markNetwork();
1381
+ }
1386
1382
  return nativeFetch(...args)
1387
1383
  .finally(() => {
1388
1384
  tracker.pendingFetches = Math.max(0, tracker.pendingFetches - 1);
1389
- markNetwork();
1385
+ if (tracked) {
1386
+ tracker.trackedPendingFetches = Math.max(0, tracker.trackedPendingFetches - 1);
1387
+ markTrackedNetwork();
1388
+ } else {
1389
+ markNetwork();
1390
+ }
1390
1391
  });
1391
1392
  };
1392
1393
  }
@@ -1395,21 +1396,60 @@ function buildPostLoadTrackerInstallScript() {
1395
1396
  const NativeXMLHttpRequest = globalObject.XMLHttpRequest;
1396
1397
  const nativeSend = NativeXMLHttpRequest.prototype.send;
1397
1398
  NativeXMLHttpRequest.prototype.send = function(...args) {
1399
+ const tracked = tracker.collecting === true;
1398
1400
  tracker.pendingXhrs += 1;
1399
- markNetwork();
1401
+ if (tracked) {
1402
+ tracker.trackedPendingXhrs += 1;
1403
+ markTrackedNetwork();
1404
+ } else {
1405
+ markNetwork();
1406
+ }
1400
1407
  const finalize = () => {
1401
1408
  this.removeEventListener("loadend", finalize);
1402
1409
  tracker.pendingXhrs = Math.max(0, tracker.pendingXhrs - 1);
1403
- markNetwork();
1410
+ if (tracked) {
1411
+ tracker.trackedPendingXhrs = Math.max(0, tracker.trackedPendingXhrs - 1);
1412
+ markTrackedNetwork();
1413
+ } else {
1414
+ markNetwork();
1415
+ }
1404
1416
  };
1405
1417
  this.addEventListener("loadend", finalize, { once: true });
1406
1418
  return nativeSend.apply(this, args);
1407
1419
  };
1408
1420
  }
1409
1421
 
1422
+ tracker.beginObservation = () => {
1423
+ resetTracking();
1424
+ return true;
1425
+ };
1426
+ tracker.freezeObservation = () => {
1427
+ tracker.collecting = false;
1428
+ tracker.readyState = document.readyState;
1429
+ return true;
1430
+ };
1431
+
1410
1432
  return true;
1411
1433
  })()`;
1412
1434
  }
1435
+ function buildPostLoadTrackerBeginExpression() {
1436
+ return `(() => {
1437
+ const tracker = globalThis.__opensteerActionBoundaryTracker;
1438
+ if (!tracker || typeof tracker.beginObservation !== "function") {
1439
+ return false;
1440
+ }
1441
+ return tracker.beginObservation();
1442
+ })()`;
1443
+ }
1444
+ function buildPostLoadTrackerFreezeExpression() {
1445
+ return `(() => {
1446
+ const tracker = globalThis.__opensteerActionBoundaryTracker;
1447
+ if (!tracker || typeof tracker.freezeObservation !== "function") {
1448
+ return false;
1449
+ }
1450
+ return tracker.freezeObservation();
1451
+ })()`;
1452
+ }
1413
1453
  function buildPostLoadTrackerReadExpression() {
1414
1454
  return `(() => {
1415
1455
  const tracker = globalThis.__opensteerActionBoundaryTracker;
@@ -1421,14 +1461,31 @@ function buildPostLoadTrackerReadExpression() {
1421
1461
  installedAt: Number(tracker.installedAt ?? 0),
1422
1462
  lastMutationAt: Number(tracker.lastMutationAt ?? 0),
1423
1463
  lastNetworkActivityAt: Number(tracker.lastNetworkActivityAt ?? 0),
1464
+ lastTrackedNetworkActivityAt: Number(tracker.lastTrackedNetworkActivityAt ?? 0),
1424
1465
  now: Number(performance.now()),
1425
1466
  pendingFetches: Number(tracker.pendingFetches ?? 0),
1426
1467
  pendingTimeouts: Number(tracker.pendingTimeouts ?? 0),
1427
1468
  pendingXhrs: Number(tracker.pendingXhrs ?? 0),
1469
+ trackedPendingFetches: Number(tracker.trackedPendingFetches ?? 0),
1470
+ trackedPendingXhrs: Number(tracker.trackedPendingXhrs ?? 0),
1471
+ collecting: tracker.collecting === true,
1428
1472
  readyState: String(document.readyState),
1429
1473
  };
1430
1474
  })()`;
1431
1475
  }
1476
+ function capturePostLoadTrackerSnapshot(tracker) {
1477
+ return {
1478
+ lastTrackedNetworkActivityAt: tracker.lastTrackedNetworkActivityAt,
1479
+ trackedPendingFetches: tracker.trackedPendingFetches,
1480
+ trackedPendingXhrs: tracker.trackedPendingXhrs
1481
+ };
1482
+ }
1483
+ function postLoadTrackerHasTrackedNetworkActivitySince(snapshot, tracker) {
1484
+ if (!tracker) {
1485
+ return false;
1486
+ }
1487
+ return tracker.trackedPendingFetches > snapshot.trackedPendingFetches || tracker.trackedPendingXhrs > snapshot.trackedPendingXhrs || tracker.lastTrackedNetworkActivityAt > snapshot.lastTrackedNetworkActivityAt;
1488
+ }
1432
1489
  function postLoadTrackerIsSettled(tracker, quietWindowMs = DEFAULT_POST_LOAD_TRACKER_QUIET_WINDOW_MS) {
1433
1490
  if (!tracker) {
1434
1491
  return false;
@@ -1436,13 +1493,13 @@ function postLoadTrackerIsSettled(tracker, quietWindowMs = DEFAULT_POST_LOAD_TRA
1436
1493
  if (tracker.readyState !== "complete") {
1437
1494
  return false;
1438
1495
  }
1439
- if (tracker.pendingFetches > 0 || tracker.pendingTimeouts > 0 || tracker.pendingXhrs > 0) {
1496
+ if (tracker.trackedPendingFetches > 0 || tracker.trackedPendingXhrs > 0) {
1440
1497
  return false;
1441
1498
  }
1442
1499
  const lastActivityAt = Math.max(
1443
1500
  tracker.installedAt,
1444
1501
  tracker.lastMutationAt,
1445
- tracker.lastNetworkActivityAt
1502
+ tracker.lastTrackedNetworkActivityAt
1446
1503
  );
1447
1504
  return tracker.now - lastActivityAt >= quietWindowMs;
1448
1505
  }
@@ -1464,7 +1521,7 @@ async function waitForActionBoundary(input) {
1464
1521
  const pollIntervalMs = input.pollIntervalMs ?? DEFAULT_ACTION_BOUNDARY_POLL_INTERVAL_MS;
1465
1522
  let trigger = "dom-action";
1466
1523
  let crossDocument = false;
1467
- let waitedForNavigationContentLoaded = false;
1524
+ let sameDocumentAsyncActivity = false;
1468
1525
  while (Date.now() < deadline) {
1469
1526
  input.throwBackgroundError();
1470
1527
  if (input.isPageClosed()) {
@@ -1486,16 +1543,21 @@ async function waitForActionBoundary(input) {
1486
1543
  throw abortError(input.signal);
1487
1544
  }
1488
1545
  const currentDocumentRef = input.getCurrentMainFrameDocumentRef();
1546
+ const currentPageUrl = input.getCurrentPageUrl?.();
1489
1547
  if (input.snapshot !== void 0 && currentDocumentRef !== void 0 && currentDocumentRef !== input.snapshot.documentRef) {
1490
1548
  trigger = "navigation";
1491
1549
  crossDocument = true;
1492
- if (!waitedForNavigationContentLoaded) {
1493
- waitedForNavigationContentLoaded = true;
1494
- const remaining = Math.max(0, deadline - Date.now());
1495
- if (remaining > 0) {
1496
- await input.waitForNavigationContentLoaded(remaining);
1497
- }
1498
- }
1550
+ }
1551
+ if (!crossDocument && !sameDocumentAsyncActivity && input.snapshot?.tracker !== void 0 && postLoadTrackerHasTrackedNetworkActivitySince(
1552
+ input.snapshot.tracker,
1553
+ await input.readTrackerState()
1554
+ )) {
1555
+ trigger = "navigation";
1556
+ sameDocumentAsyncActivity = true;
1557
+ }
1558
+ if (!crossDocument && input.snapshot?.url !== void 0 && currentPageUrl !== void 0 && currentPageUrl !== input.snapshot.url && input.isCurrentMainFrameBootstrapSettled !== void 0 && !input.isCurrentMainFrameBootstrapSettled()) {
1559
+ trigger = "navigation";
1560
+ crossDocument = true;
1499
1561
  }
1500
1562
  if (!crossDocument && crossDocumentDetectionDeadline !== void 0 && Date.now() >= crossDocumentDetectionDeadline) {
1501
1563
  return {
@@ -1504,7 +1566,18 @@ async function waitForActionBoundary(input) {
1504
1566
  bootstrapSettled: true
1505
1567
  };
1506
1568
  }
1507
- if (crossDocument && postLoadTrackerIsSettled(await input.readTrackerState())) {
1569
+ if (sameDocumentAsyncActivity) {
1570
+ return {
1571
+ trigger,
1572
+ crossDocument,
1573
+ bootstrapSettled: true
1574
+ };
1575
+ }
1576
+ if (crossDocument && input.isCurrentMainFrameBootstrapSettled !== void 0 && !input.isCurrentMainFrameBootstrapSettled()) {
1577
+ await delay(Math.min(pollIntervalMs, Math.max(0, deadline - Date.now())));
1578
+ continue;
1579
+ }
1580
+ if (crossDocument) {
1508
1581
  return {
1509
1582
  trigger,
1510
1583
  crossDocument,
@@ -2271,6 +2344,7 @@ function normalizeSelectChooserEventData(data) {
2271
2344
 
2272
2345
  // src/action-settle.ts
2273
2346
  var DEFAULT_ABP_ACTION_SETTLE_TIMEOUT_MS = CROSS_DOCUMENT_INTERACTION_TIMEOUT_MS;
2347
+ var DEFAULT_ABP_POST_LOAD_CAPTURE_WINDOW_MS = 1e3;
2274
2348
  function clampAbpActionSettleTimeout(timeoutMs) {
2275
2349
  if (timeoutMs === void 0) {
2276
2350
  return DEFAULT_ABP_ACTION_SETTLE_TIMEOUT_MS;
@@ -2282,6 +2356,8 @@ function abortError2(signal) {
2282
2356
  }
2283
2357
  function createAbpActionSettler(context) {
2284
2358
  const installScript = buildPostLoadTrackerInstallScript();
2359
+ const beginExpression = buildPostLoadTrackerBeginExpression();
2360
+ const freezeExpression = buildPostLoadTrackerFreezeExpression();
2285
2361
  const readExpression = buildPostLoadTrackerReadExpression();
2286
2362
  async function installTracker(controller) {
2287
2363
  if (!controller.settleTrackerRegistered) {
@@ -2311,6 +2387,67 @@ function createAbpActionSettler(context) {
2311
2387
  throw error;
2312
2388
  }
2313
2389
  }
2390
+ async function beginTrackerObservation(controller) {
2391
+ await installTracker(controller);
2392
+ await controller.cdp.send("Runtime.evaluate", {
2393
+ expression: beginExpression,
2394
+ returnByValue: true,
2395
+ awaitPromise: true
2396
+ });
2397
+ }
2398
+ async function freezeTrackerObservation(controller) {
2399
+ await controller.cdp.send("Runtime.evaluate", {
2400
+ expression: freezeExpression,
2401
+ returnByValue: true,
2402
+ awaitPromise: true
2403
+ });
2404
+ }
2405
+ async function captureSnapshot(controller) {
2406
+ const documentRef = context.getMainFrameDocumentRef(controller);
2407
+ if (documentRef === void 0) {
2408
+ throw new Error(`page ${controller.pageRef} does not expose a main frame`);
2409
+ }
2410
+ await beginTrackerObservation(controller);
2411
+ const tracker = await readTrackerState(controller);
2412
+ return {
2413
+ pageRef: controller.pageRef,
2414
+ documentRef,
2415
+ ...controller.mainFrameRef === void 0 ? {} : {
2416
+ url: controller.framesByCdpId.get(controller.mainFrameRef)?.currentDocument.url
2417
+ },
2418
+ ...tracker === void 0 ? {} : { tracker: capturePostLoadTrackerSnapshot(tracker) }
2419
+ };
2420
+ }
2421
+ async function waitForPostLoadQuiet(input) {
2422
+ const { controller, timeoutMs, signal } = input;
2423
+ if (timeoutMs <= 0) {
2424
+ return;
2425
+ }
2426
+ const quietMs = input.quietMs ?? DEFAULT_POST_LOAD_TRACKER_QUIET_WINDOW_MS;
2427
+ const captureWindowMs = Math.max(
2428
+ 0,
2429
+ Math.min(input.captureWindowMs ?? DEFAULT_ABP_POST_LOAD_CAPTURE_WINDOW_MS, timeoutMs)
2430
+ );
2431
+ const deadline = Date.now() + timeoutMs;
2432
+ await installTracker(controller);
2433
+ if (captureWindowMs > 0) {
2434
+ await delayWithSignal(captureWindowMs, signal, deadline);
2435
+ }
2436
+ await freezeTrackerObservation(controller);
2437
+ while (Date.now() < deadline) {
2438
+ if (signal?.aborted) {
2439
+ throw abortError2(signal);
2440
+ }
2441
+ context.throwBackgroundError(controller);
2442
+ if (controller.lifecycleState === "closed") {
2443
+ return;
2444
+ }
2445
+ if (postLoadTrackerIsSettled(await readTrackerState(controller), quietMs)) {
2446
+ return;
2447
+ }
2448
+ await delayWithSignal(100, signal, deadline);
2449
+ }
2450
+ }
2314
2451
  async function settle(options) {
2315
2452
  const { controller, timeoutMs, signal, snapshot, policySettle } = options;
2316
2453
  if (timeoutMs <= 0) {
@@ -2351,7 +2488,8 @@ function createAbpActionSettler(context) {
2351
2488
  ...signal === void 0 ? {} : { signal },
2352
2489
  snapshot,
2353
2490
  getCurrentMainFrameDocumentRef: () => context.getMainFrameDocumentRef(controller),
2354
- waitForNavigationContentLoaded: (remainingMs) => context.waitForNavigationContentLoaded(controller, remainingMs),
2491
+ getCurrentPageUrl: () => controller.mainFrameRef === void 0 ? void 0 : controller.framesByCdpId.get(controller.mainFrameRef)?.currentDocument.url,
2492
+ isCurrentMainFrameBootstrapSettled: () => context.isCurrentMainFrameBootstrapSettled(controller),
2355
2493
  readTrackerState: () => readTrackerState(controller),
2356
2494
  throwBackgroundError: () => context.throwBackgroundError(controller),
2357
2495
  isPageClosed: () => controller.lifecycleState === "closed"
@@ -2383,10 +2521,33 @@ function createAbpActionSettler(context) {
2383
2521
  return boundary;
2384
2522
  }
2385
2523
  return {
2524
+ captureSnapshot,
2386
2525
  installTracker,
2526
+ waitForPostLoadQuiet,
2387
2527
  settle
2388
2528
  };
2389
2529
  }
2530
+ async function delayWithSignal(delayMs, signal, deadline) {
2531
+ const effectiveDelay = Math.max(0, Math.min(delayMs, Math.max(0, deadline - Date.now())));
2532
+ if (effectiveDelay <= 0) {
2533
+ return;
2534
+ }
2535
+ if (signal?.aborted) {
2536
+ throw abortError2(signal);
2537
+ }
2538
+ await new Promise((resolve, reject) => {
2539
+ const timer = setTimeout(() => {
2540
+ signal?.removeEventListener("abort", onAbort);
2541
+ resolve();
2542
+ }, effectiveDelay);
2543
+ const onAbort = () => {
2544
+ clearTimeout(timer);
2545
+ signal?.removeEventListener("abort", onAbort);
2546
+ reject(abortError2(signal));
2547
+ };
2548
+ signal?.addEventListener("abort", onAbort, { once: true });
2549
+ });
2550
+ }
2390
2551
 
2391
2552
  // src/rest-client.ts
2392
2553
  function isRecord3(value) {
@@ -4301,7 +4462,7 @@ var AbpBrowserCoreEngine = class _AbpBrowserCoreEngine {
4301
4462
  setExecutionPaused: (controller, paused) => this.setControllerExecutionPaused(controller, paused),
4302
4463
  flushDomUpdateTask: (controller) => this.flushDomUpdateTask(controller),
4303
4464
  getMainFrameDocumentRef: (controller) => controller.mainFrameRef === void 0 ? void 0 : this.frames.get(controller.mainFrameRef)?.currentDocument.documentRef,
4304
- waitForNavigationContentLoaded: async () => void 0,
4465
+ isCurrentMainFrameBootstrapSettled: () => true,
4305
4466
  throwBackgroundError: (controller) => this.throwBackgroundError(controller),
4306
4467
  isPageClosedError: isAbpPageClosedError
4307
4468
  });
@@ -5064,6 +5225,9 @@ var AbpBrowserCoreEngine = class _AbpBrowserCoreEngine {
5064
5225
  )
5065
5226
  );
5066
5227
  }
5228
+ async drainEvents(input) {
5229
+ return this.drainQueuedEvents(input.pageRef);
5230
+ }
5067
5231
  async listFrames(input) {
5068
5232
  const controller = this.requirePage(input.pageRef);
5069
5233
  await this.flushDomUpdateTask(controller);
@@ -5115,6 +5279,11 @@ var AbpBrowserCoreEngine = class _AbpBrowserCoreEngine {
5115
5279
  (contentDocumentIndex) => resolveCapturedContentDocumentRef(controller.framesByCdpId, captured, contentDocumentIndex)
5116
5280
  );
5117
5281
  }
5282
+ async getActionBoundarySnapshot(input) {
5283
+ const controller = this.requirePage(input.pageRef);
5284
+ await this.flushDomUpdateTask(controller);
5285
+ return this.actionSettler.captureSnapshot(controller);
5286
+ }
5118
5287
  async waitForVisualStability(input) {
5119
5288
  const controller = this.requirePage(input.pageRef);
5120
5289
  await this.flushDomUpdateTask(controller);
@@ -5125,6 +5294,20 @@ var AbpBrowserCoreEngine = class _AbpBrowserCoreEngine {
5125
5294
  });
5126
5295
  await this.flushDomUpdateTask(controller);
5127
5296
  }
5297
+ async waitForPostLoadQuiet(input) {
5298
+ const controller = this.requirePage(input.pageRef);
5299
+ await this.flushDomUpdateTask(controller);
5300
+ await this.actionSettler.waitForPostLoadQuiet({
5301
+ controller,
5302
+ timeoutMs: clampAbpActionSettleTimeout(input.timeoutMs),
5303
+ ...input.quietMs === void 0 ? {} : { quietMs: input.quietMs },
5304
+ ...input.captureWindowMs === void 0 ? {} : { captureWindowMs: input.captureWindowMs },
5305
+ ...input.signal === void 0 ? {} : { signal: input.signal }
5306
+ });
5307
+ if (controller.lifecycleState !== "closed") {
5308
+ await this.flushDomUpdateTask(controller);
5309
+ }
5310
+ }
5128
5311
  async readText(input) {
5129
5312
  const document = this.requireDocument(input.documentRef);
5130
5313
  const controller = this.requirePage(document.pageRef);