@opensteer/browser-core 0.7.2 → 0.7.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.js CHANGED
@@ -1043,6 +1043,9 @@ var FakeBrowserCoreEngine = class {
1043
1043
  (pageRef) => clone(this.pageInfoFromState(this.requirePage(pageRef)))
1044
1044
  );
1045
1045
  }
1046
+ async drainEvents(input) {
1047
+ return this.drainQueuedEvents(input.pageRef);
1048
+ }
1046
1049
  async listFrames(input) {
1047
1050
  this.requireCapability("inspector.frameEnumeration");
1048
1051
  const page = this.requirePage(input.pageRef);
@@ -1066,9 +1069,30 @@ var FakeBrowserCoreEngine = class {
1066
1069
  const document = this.resolveDocumentInput(input);
1067
1070
  return clone(document.domSnapshot);
1068
1071
  }
1072
+ async getActionBoundarySnapshot(input) {
1073
+ this.requireCapability("inspector.frameEnumeration");
1074
+ const page = this.requirePage(input.pageRef);
1075
+ const mainFrameRef = Array.from(page.frameRefs).find(
1076
+ (frameRef) => this.requireFrame(frameRef).frameInfo.isMainFrame
1077
+ );
1078
+ if (mainFrameRef === void 0) {
1079
+ throw createBrowserCoreError(
1080
+ "operation-failed",
1081
+ `page ${input.pageRef} does not expose a main frame`
1082
+ );
1083
+ }
1084
+ const frame = this.requireFrame(mainFrameRef);
1085
+ return {
1086
+ pageRef: input.pageRef,
1087
+ documentRef: frame.frameInfo.documentRef,
1088
+ url: frame.frameInfo.url
1089
+ };
1090
+ }
1069
1091
  async waitForVisualStability(_input) {
1070
1092
  this.requireCapability("inspector.visualStability");
1071
1093
  }
1094
+ async waitForPostLoadQuiet(_input) {
1095
+ }
1072
1096
  async readText(input) {
1073
1097
  this.requireCapability("inspector.text");
1074
1098
  const document = this.requireLiveNode(input);
@@ -2861,19 +2885,24 @@ function normalizePostLoadTrackerState(value) {
2861
2885
  const installedAt = readFiniteNumber(value.installedAt);
2862
2886
  const lastMutationAt = readFiniteNumber(value.lastMutationAt);
2863
2887
  const lastNetworkActivityAt = readFiniteNumber(value.lastNetworkActivityAt);
2888
+ const lastTrackedNetworkActivityAt = readFiniteNumber(value.lastTrackedNetworkActivityAt);
2864
2889
  const now = readFiniteNumber(value.now);
2865
2890
  const readyState = typeof value.readyState === "string" ? value.readyState : void 0;
2866
- if (installedAt === void 0 || lastMutationAt === void 0 || lastNetworkActivityAt === void 0 || now === void 0 || readyState === void 0) {
2891
+ if (installedAt === void 0 || lastMutationAt === void 0 || lastNetworkActivityAt === void 0 || lastTrackedNetworkActivityAt === void 0 || now === void 0 || readyState === void 0) {
2867
2892
  return void 0;
2868
2893
  }
2869
2894
  return {
2870
2895
  installedAt,
2871
2896
  lastMutationAt,
2872
2897
  lastNetworkActivityAt,
2898
+ lastTrackedNetworkActivityAt,
2873
2899
  now,
2874
2900
  pendingFetches: readNonNegativeNumber(value.pendingFetches),
2875
2901
  pendingTimeouts: readNonNegativeNumber(value.pendingTimeouts),
2876
2902
  pendingXhrs: readNonNegativeNumber(value.pendingXhrs),
2903
+ trackedPendingFetches: readNonNegativeNumber(value.trackedPendingFetches),
2904
+ trackedPendingXhrs: readNonNegativeNumber(value.trackedPendingXhrs),
2905
+ collecting: value.collecting === true,
2877
2906
  readyState
2878
2907
  };
2879
2908
  }
@@ -2888,11 +2917,14 @@ function buildPostLoadTrackerInstallScript() {
2888
2917
  installedAt: performance.now(),
2889
2918
  lastMutationAt: performance.now(),
2890
2919
  lastNetworkActivityAt: performance.now(),
2920
+ lastTrackedNetworkActivityAt: performance.now(),
2891
2921
  pendingFetches: 0,
2892
2922
  pendingTimeouts: 0,
2893
2923
  pendingXhrs: 0,
2924
+ trackedPendingFetches: 0,
2925
+ trackedPendingXhrs: 0,
2926
+ collecting: true,
2894
2927
  readyState: document.readyState,
2895
- timeoutIds: new Set(),
2896
2928
  };
2897
2929
  globalObject.__opensteerActionBoundaryTrackerInstalled = true;
2898
2930
  globalObject.__opensteerActionBoundaryTracker = tracker;
@@ -2905,6 +2937,18 @@ function buildPostLoadTrackerInstallScript() {
2905
2937
  tracker.lastNetworkActivityAt = performance.now();
2906
2938
  tracker.readyState = document.readyState;
2907
2939
  };
2940
+ const markTrackedNetwork = () => {
2941
+ tracker.lastTrackedNetworkActivityAt = performance.now();
2942
+ markNetwork();
2943
+ };
2944
+ const resetTracking = () => {
2945
+ const now = performance.now();
2946
+ tracker.lastTrackedNetworkActivityAt = now;
2947
+ tracker.trackedPendingFetches = 0;
2948
+ tracker.trackedPendingXhrs = 0;
2949
+ tracker.collecting = true;
2950
+ tracker.readyState = document.readyState;
2951
+ };
2908
2952
 
2909
2953
  const startObserver = () => {
2910
2954
  const target = document.documentElement ?? document;
@@ -2930,45 +2974,26 @@ function buildPostLoadTrackerInstallScript() {
2930
2974
  document.addEventListener("readystatechange", markMutation);
2931
2975
  addEventListener("load", markMutation, { once: true });
2932
2976
 
2933
- const nativeSetTimeout = globalObject.setTimeout.bind(globalObject);
2934
- const nativeClearTimeout = globalObject.clearTimeout.bind(globalObject);
2935
- globalObject.setTimeout = function(callback, delay, ...args) {
2936
- tracker.pendingTimeouts += 1;
2937
- markNetwork();
2938
- let handle;
2939
- const wrapped =
2940
- typeof callback === "function"
2941
- ? (...callbackArgs) => {
2942
- if (tracker.timeoutIds.delete(handle)) {
2943
- tracker.pendingTimeouts = Math.max(0, tracker.pendingTimeouts - 1);
2944
- }
2945
- try {
2946
- return callback(...callbackArgs);
2947
- } finally {
2948
- markMutation();
2949
- }
2950
- }
2951
- : callback;
2952
- handle = nativeSetTimeout(wrapped, delay, ...args);
2953
- tracker.timeoutIds.add(handle);
2954
- return handle;
2955
- };
2956
- globalObject.clearTimeout = function(handle) {
2957
- if (tracker.timeoutIds.delete(handle)) {
2958
- tracker.pendingTimeouts = Math.max(0, tracker.pendingTimeouts - 1);
2959
- }
2960
- return nativeClearTimeout(handle);
2961
- };
2962
-
2963
2977
  if (typeof globalObject.fetch === "function") {
2964
2978
  const nativeFetch = globalObject.fetch.bind(globalObject);
2965
2979
  globalObject.fetch = (...args) => {
2980
+ const tracked = tracker.collecting === true;
2966
2981
  tracker.pendingFetches += 1;
2967
- markNetwork();
2982
+ if (tracked) {
2983
+ tracker.trackedPendingFetches += 1;
2984
+ markTrackedNetwork();
2985
+ } else {
2986
+ markNetwork();
2987
+ }
2968
2988
  return nativeFetch(...args)
2969
2989
  .finally(() => {
2970
2990
  tracker.pendingFetches = Math.max(0, tracker.pendingFetches - 1);
2971
- markNetwork();
2991
+ if (tracked) {
2992
+ tracker.trackedPendingFetches = Math.max(0, tracker.trackedPendingFetches - 1);
2993
+ markTrackedNetwork();
2994
+ } else {
2995
+ markNetwork();
2996
+ }
2972
2997
  });
2973
2998
  };
2974
2999
  }
@@ -2977,21 +3002,60 @@ function buildPostLoadTrackerInstallScript() {
2977
3002
  const NativeXMLHttpRequest = globalObject.XMLHttpRequest;
2978
3003
  const nativeSend = NativeXMLHttpRequest.prototype.send;
2979
3004
  NativeXMLHttpRequest.prototype.send = function(...args) {
3005
+ const tracked = tracker.collecting === true;
2980
3006
  tracker.pendingXhrs += 1;
2981
- markNetwork();
3007
+ if (tracked) {
3008
+ tracker.trackedPendingXhrs += 1;
3009
+ markTrackedNetwork();
3010
+ } else {
3011
+ markNetwork();
3012
+ }
2982
3013
  const finalize = () => {
2983
3014
  this.removeEventListener("loadend", finalize);
2984
3015
  tracker.pendingXhrs = Math.max(0, tracker.pendingXhrs - 1);
2985
- markNetwork();
3016
+ if (tracked) {
3017
+ tracker.trackedPendingXhrs = Math.max(0, tracker.trackedPendingXhrs - 1);
3018
+ markTrackedNetwork();
3019
+ } else {
3020
+ markNetwork();
3021
+ }
2986
3022
  };
2987
3023
  this.addEventListener("loadend", finalize, { once: true });
2988
3024
  return nativeSend.apply(this, args);
2989
3025
  };
2990
3026
  }
2991
3027
 
3028
+ tracker.beginObservation = () => {
3029
+ resetTracking();
3030
+ return true;
3031
+ };
3032
+ tracker.freezeObservation = () => {
3033
+ tracker.collecting = false;
3034
+ tracker.readyState = document.readyState;
3035
+ return true;
3036
+ };
3037
+
2992
3038
  return true;
2993
3039
  })()`;
2994
3040
  }
3041
+ function buildPostLoadTrackerBeginExpression() {
3042
+ return `(() => {
3043
+ const tracker = globalThis.__opensteerActionBoundaryTracker;
3044
+ if (!tracker || typeof tracker.beginObservation !== "function") {
3045
+ return false;
3046
+ }
3047
+ return tracker.beginObservation();
3048
+ })()`;
3049
+ }
3050
+ function buildPostLoadTrackerFreezeExpression() {
3051
+ return `(() => {
3052
+ const tracker = globalThis.__opensteerActionBoundaryTracker;
3053
+ if (!tracker || typeof tracker.freezeObservation !== "function") {
3054
+ return false;
3055
+ }
3056
+ return tracker.freezeObservation();
3057
+ })()`;
3058
+ }
2995
3059
  function buildPostLoadTrackerReadExpression() {
2996
3060
  return `(() => {
2997
3061
  const tracker = globalThis.__opensteerActionBoundaryTracker;
@@ -3003,14 +3067,31 @@ function buildPostLoadTrackerReadExpression() {
3003
3067
  installedAt: Number(tracker.installedAt ?? 0),
3004
3068
  lastMutationAt: Number(tracker.lastMutationAt ?? 0),
3005
3069
  lastNetworkActivityAt: Number(tracker.lastNetworkActivityAt ?? 0),
3070
+ lastTrackedNetworkActivityAt: Number(tracker.lastTrackedNetworkActivityAt ?? 0),
3006
3071
  now: Number(performance.now()),
3007
3072
  pendingFetches: Number(tracker.pendingFetches ?? 0),
3008
3073
  pendingTimeouts: Number(tracker.pendingTimeouts ?? 0),
3009
3074
  pendingXhrs: Number(tracker.pendingXhrs ?? 0),
3075
+ trackedPendingFetches: Number(tracker.trackedPendingFetches ?? 0),
3076
+ trackedPendingXhrs: Number(tracker.trackedPendingXhrs ?? 0),
3077
+ collecting: tracker.collecting === true,
3010
3078
  readyState: String(document.readyState),
3011
3079
  };
3012
3080
  })()`;
3013
3081
  }
3082
+ function capturePostLoadTrackerSnapshot(tracker) {
3083
+ return {
3084
+ lastTrackedNetworkActivityAt: tracker.lastTrackedNetworkActivityAt,
3085
+ trackedPendingFetches: tracker.trackedPendingFetches,
3086
+ trackedPendingXhrs: tracker.trackedPendingXhrs
3087
+ };
3088
+ }
3089
+ function postLoadTrackerHasTrackedNetworkActivitySince(snapshot, tracker) {
3090
+ if (!tracker) {
3091
+ return false;
3092
+ }
3093
+ return tracker.trackedPendingFetches > snapshot.trackedPendingFetches || tracker.trackedPendingXhrs > snapshot.trackedPendingXhrs || tracker.lastTrackedNetworkActivityAt > snapshot.lastTrackedNetworkActivityAt;
3094
+ }
3014
3095
  function postLoadTrackerIsSettled(tracker, quietWindowMs = DEFAULT_POST_LOAD_TRACKER_QUIET_WINDOW_MS) {
3015
3096
  if (!tracker) {
3016
3097
  return false;
@@ -3018,13 +3099,13 @@ function postLoadTrackerIsSettled(tracker, quietWindowMs = DEFAULT_POST_LOAD_TRA
3018
3099
  if (tracker.readyState !== "complete") {
3019
3100
  return false;
3020
3101
  }
3021
- if (tracker.pendingFetches > 0 || tracker.pendingTimeouts > 0 || tracker.pendingXhrs > 0) {
3102
+ if (tracker.trackedPendingFetches > 0 || tracker.trackedPendingXhrs > 0) {
3022
3103
  return false;
3023
3104
  }
3024
3105
  const lastActivityAt = Math.max(
3025
3106
  tracker.installedAt,
3026
3107
  tracker.lastMutationAt,
3027
- tracker.lastNetworkActivityAt
3108
+ tracker.lastTrackedNetworkActivityAt
3028
3109
  );
3029
3110
  return tracker.now - lastActivityAt >= quietWindowMs;
3030
3111
  }
@@ -3046,7 +3127,7 @@ async function waitForActionBoundary(input) {
3046
3127
  const pollIntervalMs = input.pollIntervalMs ?? DEFAULT_ACTION_BOUNDARY_POLL_INTERVAL_MS;
3047
3128
  let trigger = "dom-action";
3048
3129
  let crossDocument = false;
3049
- let waitedForNavigationContentLoaded = false;
3130
+ let sameDocumentAsyncActivity = false;
3050
3131
  while (Date.now() < deadline) {
3051
3132
  input.throwBackgroundError();
3052
3133
  if (input.isPageClosed()) {
@@ -3068,16 +3149,21 @@ async function waitForActionBoundary(input) {
3068
3149
  throw abortError(input.signal);
3069
3150
  }
3070
3151
  const currentDocumentRef = input.getCurrentMainFrameDocumentRef();
3152
+ const currentPageUrl = input.getCurrentPageUrl?.();
3071
3153
  if (input.snapshot !== void 0 && currentDocumentRef !== void 0 && currentDocumentRef !== input.snapshot.documentRef) {
3072
3154
  trigger = "navigation";
3073
3155
  crossDocument = true;
3074
- if (!waitedForNavigationContentLoaded) {
3075
- waitedForNavigationContentLoaded = true;
3076
- const remaining = Math.max(0, deadline - Date.now());
3077
- if (remaining > 0) {
3078
- await input.waitForNavigationContentLoaded(remaining);
3079
- }
3080
- }
3156
+ }
3157
+ if (!crossDocument && !sameDocumentAsyncActivity && input.snapshot?.tracker !== void 0 && postLoadTrackerHasTrackedNetworkActivitySince(
3158
+ input.snapshot.tracker,
3159
+ await input.readTrackerState()
3160
+ )) {
3161
+ trigger = "navigation";
3162
+ sameDocumentAsyncActivity = true;
3163
+ }
3164
+ if (!crossDocument && input.snapshot?.url !== void 0 && currentPageUrl !== void 0 && currentPageUrl !== input.snapshot.url && input.isCurrentMainFrameBootstrapSettled !== void 0 && !input.isCurrentMainFrameBootstrapSettled()) {
3165
+ trigger = "navigation";
3166
+ crossDocument = true;
3081
3167
  }
3082
3168
  if (!crossDocument && crossDocumentDetectionDeadline !== void 0 && Date.now() >= crossDocumentDetectionDeadline) {
3083
3169
  return {
@@ -3086,7 +3172,18 @@ async function waitForActionBoundary(input) {
3086
3172
  bootstrapSettled: true
3087
3173
  };
3088
3174
  }
3089
- if (crossDocument && postLoadTrackerIsSettled(await input.readTrackerState())) {
3175
+ if (sameDocumentAsyncActivity) {
3176
+ return {
3177
+ trigger,
3178
+ crossDocument,
3179
+ bootstrapSettled: true
3180
+ };
3181
+ }
3182
+ if (crossDocument && input.isCurrentMainFrameBootstrapSettled !== void 0 && !input.isCurrentMainFrameBootstrapSettled()) {
3183
+ await delay(Math.min(pollIntervalMs, Math.max(0, deadline - Date.now())));
3184
+ continue;
3185
+ }
3186
+ if (crossDocument) {
3090
3187
  return {
3091
3188
  trigger,
3092
3189
  crossDocument,
@@ -3117,6 +3214,6 @@ function isTimeoutAbort(reason) {
3117
3214
  return typeof reason === "object" && reason !== null && "code" in reason && reason.code === "timeout";
3118
3215
  }
3119
3216
 
3120
- export { BrowserCoreError, CROSS_DOCUMENT_DETECTION_WINDOW_MS, CROSS_DOCUMENT_INTERACTION_TIMEOUT_MS, DEFAULT_ACTION_BOUNDARY_POLL_INTERVAL_MS, DEFAULT_POST_LOAD_TRACKER_QUIET_WINDOW_MS, DEFAULT_VISUAL_STABILITY_SETTLE_MS, DEFAULT_VISUAL_STABILITY_TIMEOUT_MS, DOM_SNAPSHOT_COMPUTED_STYLE_NAMES, FakeBrowserCoreEngine, allBrowserCapabilities, bodyPayloadFromUtf8, brand, buildCdpShadowBoundaryIndex, buildDomSnapshotFromCdpCapture, buildPostLoadTrackerInstallScript, buildPostLoadTrackerReadExpression, closedPageError, closedSessionError, createBodyPayload, createBrowserCoreError, createChooserRef, createDevicePixelRatio, createDialogRef, createDocumentEpoch, createDocumentRef, createDownloadRef, createFakeBrowserCoreEngine, createFrameRef, createHeaderEntry, createNetworkRequestId, createNodeLocator, createNodeRef, createPageRef, createPageScaleFactor, createPageZoomFactor, createPoint, createQuad, createRect, createScrollOffset, createSessionRef, createSize, createWorkerRef, filterCookieRecords, findDomSnapshotNode, findDomSnapshotNodeByRef, hasCapability, isBrowserCoreError, isChooserRef, isDialogRef, isDocumentRef, isDownloadRef, isFrameRef, isNetworkRequestId, isNodeRef, isPageRef, isSessionRef, isWorkerRef, matchesNetworkRecordFilters, mergeBrowserCapabilities, nextDocumentEpoch, noBrowserCapabilities, normalizeCdpShadowRootType, normalizePostLoadTrackerState, parseCdpStringTable, postLoadTrackerIsSettled, quadBounds, rareCdpIntegerValue, rareCdpStringValue, rectContainsPoint, rectToQuad, serializeDocumentEpoch, serializeRef, staleNodeRefError, unsupportedCapabilityError, waitForActionBoundary, waitForCdpVisualStability };
3217
+ export { BrowserCoreError, CROSS_DOCUMENT_DETECTION_WINDOW_MS, CROSS_DOCUMENT_INTERACTION_TIMEOUT_MS, DEFAULT_ACTION_BOUNDARY_POLL_INTERVAL_MS, DEFAULT_POST_LOAD_TRACKER_QUIET_WINDOW_MS, DEFAULT_VISUAL_STABILITY_SETTLE_MS, DEFAULT_VISUAL_STABILITY_TIMEOUT_MS, DOM_SNAPSHOT_COMPUTED_STYLE_NAMES, FakeBrowserCoreEngine, allBrowserCapabilities, bodyPayloadFromUtf8, brand, buildCdpShadowBoundaryIndex, buildDomSnapshotFromCdpCapture, buildPostLoadTrackerBeginExpression, buildPostLoadTrackerFreezeExpression, buildPostLoadTrackerInstallScript, buildPostLoadTrackerReadExpression, capturePostLoadTrackerSnapshot, closedPageError, closedSessionError, createBodyPayload, createBrowserCoreError, createChooserRef, createDevicePixelRatio, createDialogRef, createDocumentEpoch, createDocumentRef, createDownloadRef, createFakeBrowserCoreEngine, createFrameRef, createHeaderEntry, createNetworkRequestId, createNodeLocator, createNodeRef, createPageRef, createPageScaleFactor, createPageZoomFactor, createPoint, createQuad, createRect, createScrollOffset, createSessionRef, createSize, createWorkerRef, filterCookieRecords, findDomSnapshotNode, findDomSnapshotNodeByRef, hasCapability, isBrowserCoreError, isChooserRef, isDialogRef, isDocumentRef, isDownloadRef, isFrameRef, isNetworkRequestId, isNodeRef, isPageRef, isSessionRef, isWorkerRef, matchesNetworkRecordFilters, mergeBrowserCapabilities, nextDocumentEpoch, noBrowserCapabilities, normalizeCdpShadowRootType, normalizePostLoadTrackerState, parseCdpStringTable, postLoadTrackerHasTrackedNetworkActivitySince, postLoadTrackerIsSettled, quadBounds, rareCdpIntegerValue, rareCdpStringValue, rectContainsPoint, rectToQuad, serializeDocumentEpoch, serializeRef, staleNodeRefError, unsupportedCapabilityError, waitForActionBoundary, waitForCdpVisualStability };
3121
3218
  //# sourceMappingURL=index.js.map
3122
3219
  //# sourceMappingURL=index.js.map