testplane 9.0.13 → 9.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createClickNavigationGuard = void 0;
4
+ const click_command_guard_1 = require("./click-command-guard");
5
+ const createDeferred = () => {
6
+ let resolve;
7
+ const promise = new Promise(done => {
8
+ resolve = done;
9
+ });
10
+ return { promise, resolve };
11
+ };
12
+ /**
13
+ * Tracks click-triggered top-frame navigation using stable CDP 1.3 signals.
14
+ *
15
+ * Selectivity pauses the renderer in beforeunload to preserve coverage. ChromeDriver can return from an element click
16
+ * while that pause is active, before its own navigation wait sees the new document. The guard keeps the click pending
17
+ * through the coverage page-switch queue, navigation commit, and the configured page-load milestone.
18
+ */
19
+ class ClickNavigationTracker {
20
+ constructor(_options) {
21
+ this._options = _options;
22
+ this._navigationState = null;
23
+ this._navigationWait = null;
24
+ this._navigationGeneration = {};
25
+ this._rendererRoundtripWait = null;
26
+ this._openJavaScriptDialogType = null;
27
+ this._isBfcacheRestoreObserved = false;
28
+ this._activeClick = null;
29
+ this.startClick = () => {
30
+ this._isBfcacheRestoreObserved = false;
31
+ this._clearNavigation();
32
+ this._activeClick = {};
33
+ };
34
+ this.waitForNavigationCompletion = async () => {
35
+ try {
36
+ await this._options.waitForPageSwitch();
37
+ if (!this._activeClick) {
38
+ return;
39
+ }
40
+ await this._waitForRendererRoundtrip();
41
+ if (!this._activeClick) {
42
+ return;
43
+ }
44
+ await this._waitForNavigation();
45
+ await this._options.waitForPageSwitch();
46
+ }
47
+ finally {
48
+ this._activeClick = null;
49
+ this._isBfcacheRestoreObserved = false;
50
+ }
51
+ };
52
+ this.cancelClick = () => {
53
+ this._activeClick = null;
54
+ this._isBfcacheRestoreObserved = false;
55
+ this._rendererRoundtripWait?.resolve();
56
+ this._clearNavigation();
57
+ };
58
+ this.onBeforeUnloadPause = () => {
59
+ this._isBfcacheRestoreObserved = false;
60
+ this._markNavigationIntent();
61
+ };
62
+ this.onBfcacheRestorePause = () => {
63
+ if (!this._activeClick) {
64
+ return false;
65
+ }
66
+ this._isBfcacheRestoreObserved = true;
67
+ return true;
68
+ };
69
+ this.completeBfcacheRestore = () => {
70
+ this._clearNavigation();
71
+ };
72
+ this.addListeners = () => {
73
+ const { cdp } = this._options;
74
+ cdp.page.on("frameNavigated", this._onFrameNavigated);
75
+ cdp.page.on("domContentEventFired", this._onDomContentEventFired);
76
+ cdp.page.on("loadEventFired", this._onLoadEventFired);
77
+ cdp.page.on("javascriptDialogOpening", this._onJavaScriptDialogOpening);
78
+ cdp.page.on("javascriptDialogClosed", this._onJavaScriptDialogClosed);
79
+ };
80
+ this.removeListeners = () => {
81
+ const { cdp } = this._options;
82
+ cdp.page.off("frameNavigated", this._onFrameNavigated);
83
+ cdp.page.off("domContentEventFired", this._onDomContentEventFired);
84
+ cdp.page.off("loadEventFired", this._onLoadEventFired);
85
+ cdp.page.off("javascriptDialogOpening", this._onJavaScriptDialogOpening);
86
+ cdp.page.off("javascriptDialogClosed", this._onJavaScriptDialogClosed);
87
+ };
88
+ this._clearNavigation = () => {
89
+ this._navigationGeneration = {};
90
+ this._navigationWait?.resolve();
91
+ this._navigationWait = null;
92
+ this._navigationState = null;
93
+ };
94
+ this._markNavigationIntent = () => {
95
+ if (!this._activeClick || this._navigationState) {
96
+ return;
97
+ }
98
+ this._navigationState = "waitingForCommit";
99
+ this._navigationWait = createDeferred();
100
+ };
101
+ this._waitForNavigation = async () => {
102
+ if (this._openJavaScriptDialogType === "beforeunload") {
103
+ // Return control so the caller can accept or dismiss the prompt. Automatically accepted prompts close before
104
+ // this check and remain guarded until commit and load.
105
+ this._clearNavigation();
106
+ return;
107
+ }
108
+ const navigationWait = this._navigationWait;
109
+ const pageLoadTimeout = this._options.pageLoadTimeout;
110
+ if (!navigationWait || !pageLoadTimeout) {
111
+ await navigationWait?.promise;
112
+ return;
113
+ }
114
+ let timeoutId = null;
115
+ try {
116
+ await Promise.race([
117
+ navigationWait.promise,
118
+ new Promise((_, reject) => {
119
+ timeoutId = setTimeout(() => {
120
+ reject(new Error("Selectivity: timed out waiting for a click-triggered navigation to complete"));
121
+ }, pageLoadTimeout);
122
+ }),
123
+ ]);
124
+ }
125
+ finally {
126
+ if (timeoutId) {
127
+ clearTimeout(timeoutId);
128
+ }
129
+ this._clearNavigation();
130
+ }
131
+ };
132
+ this._waitForRendererRoundtrip = async () => {
133
+ if (this._openJavaScriptDialogType !== null) {
134
+ return;
135
+ }
136
+ const rendererRoundtripWait = createDeferred();
137
+ const activeClick = this._activeClick;
138
+ const navigationGeneration = this._navigationGeneration;
139
+ this._rendererRoundtripWait = rendererRoundtripWait;
140
+ try {
141
+ await Promise.race([
142
+ this._options.cdp.runtime
143
+ .evaluate(this._options.cdpSessionId, { expression: "1", returnByValue: true })
144
+ .then(() => undefined)
145
+ .catch(() => {
146
+ // The context can disappear after navigation starts. Ignore stale failures delivered after this
147
+ // click or navigation generation already completed.
148
+ if (this._activeClick === activeClick && this._navigationGeneration === navigationGeneration) {
149
+ this._markNavigationIntent();
150
+ }
151
+ }),
152
+ rendererRoundtripWait.promise,
153
+ ]);
154
+ }
155
+ finally {
156
+ if (this._rendererRoundtripWait === rendererRoundtripWait) {
157
+ this._rendererRoundtripWait = null;
158
+ }
159
+ }
160
+ };
161
+ this._onFrameNavigated = ({ frame }, eventCdpSessionId) => {
162
+ if (eventCdpSessionId !== this._options.cdpSessionId || frame.parentId || !this._activeClick) {
163
+ return;
164
+ }
165
+ if (this._isBfcacheRestoreObserved) {
166
+ // The pageshow.persisted pause already guards the restore through coverage flush and Debugger.resume.
167
+ this._isBfcacheRestoreObserved = false;
168
+ this._clearNavigation();
169
+ return;
170
+ }
171
+ this._markNavigationIntent();
172
+ if (this._navigationState === "waitingForCommit") {
173
+ this._navigationState = "committed";
174
+ }
175
+ };
176
+ this._onDomContentEventFired = (_params, eventCdpSessionId) => {
177
+ if (this._options.pageLoadStrategy === "eager" &&
178
+ eventCdpSessionId === this._options.cdpSessionId &&
179
+ this._navigationState === "committed") {
180
+ this._clearNavigation();
181
+ }
182
+ };
183
+ this._onLoadEventFired = (_params, eventCdpSessionId) => {
184
+ if (this._options.pageLoadStrategy === "normal" &&
185
+ eventCdpSessionId === this._options.cdpSessionId &&
186
+ this._navigationState === "committed") {
187
+ this._clearNavigation();
188
+ }
189
+ };
190
+ this._onJavaScriptDialogOpening = ({ type }, eventCdpSessionId) => {
191
+ if (eventCdpSessionId !== this._options.cdpSessionId) {
192
+ return;
193
+ }
194
+ this._openJavaScriptDialogType = type;
195
+ this._rendererRoundtripWait?.resolve();
196
+ if (type !== "beforeunload") {
197
+ this._clearNavigation();
198
+ }
199
+ };
200
+ this._onJavaScriptDialogClosed = ({ result }, eventCdpSessionId) => {
201
+ if (eventCdpSessionId !== this._options.cdpSessionId) {
202
+ return;
203
+ }
204
+ const dialogType = this._openJavaScriptDialogType;
205
+ this._openJavaScriptDialogType = null;
206
+ if (dialogType === "beforeunload" && !result) {
207
+ this._clearNavigation();
208
+ }
209
+ };
210
+ }
211
+ }
212
+ const createClickNavigationGuard = (options) => {
213
+ const tracker = new ClickNavigationTracker(options);
214
+ let disableClickCommandGuard;
215
+ try {
216
+ tracker.addListeners();
217
+ disableClickCommandGuard = (0, click_command_guard_1.enableClickCommandGuard)(options.browser, tracker);
218
+ }
219
+ catch (err) {
220
+ tracker.removeListeners();
221
+ throw err;
222
+ }
223
+ return {
224
+ onBeforeUnloadPause: tracker.onBeforeUnloadPause,
225
+ onBfcacheRestorePause: tracker.onBfcacheRestorePause,
226
+ completeBfcacheRestore: tracker.completeBfcacheRestore,
227
+ dispose: () => {
228
+ disableClickCommandGuard();
229
+ tracker.removeListeners();
230
+ },
231
+ };
232
+ };
233
+ exports.createClickNavigationGuard = createClickNavigationGuard;
234
+ //# sourceMappingURL=navigation-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation-guard.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/navigation-guard.ts"],"names":[],"mappings":"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"}