patchright-core 1.52.4 → 1.55.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.
Files changed (218) hide show
  1. package/ThirdPartyNotices.txt +65 -123
  2. package/bin/reinstall_chrome_beta_mac.sh +1 -1
  3. package/bin/reinstall_chrome_stable_mac.sh +1 -1
  4. package/bin/reinstall_msedge_beta_mac.sh +1 -1
  5. package/bin/reinstall_msedge_dev_mac.sh +1 -1
  6. package/bin/reinstall_msedge_stable_mac.sh +1 -1
  7. package/browsers.json +14 -14
  8. package/index.js +1 -1
  9. package/lib/androidServerImpl.js +4 -2
  10. package/lib/browserServerImpl.js +47 -12
  11. package/lib/cli/program.js +116 -50
  12. package/lib/cli/programWithTestStub.js +1 -1
  13. package/lib/client/android.js +30 -34
  14. package/lib/client/browser.js +54 -17
  15. package/lib/client/browserContext.js +67 -71
  16. package/lib/client/browserType.js +25 -34
  17. package/lib/client/channelOwner.js +20 -24
  18. package/lib/client/connection.js +6 -10
  19. package/lib/client/electron.js +8 -3
  20. package/lib/client/elementHandle.js +18 -21
  21. package/lib/client/fetch.js +5 -3
  22. package/lib/client/frame.js +57 -35
  23. package/lib/client/input.js +3 -1
  24. package/lib/client/jsHandle.js +4 -0
  25. package/lib/client/localUtils.js +0 -1
  26. package/lib/client/locator.js +32 -28
  27. package/lib/client/network.js +5 -12
  28. package/lib/client/page.js +32 -32
  29. package/lib/client/playwright.js +6 -16
  30. package/lib/client/selectors.js +18 -38
  31. package/lib/client/timeoutSettings.js +12 -8
  32. package/lib/client/tracing.js +24 -20
  33. package/lib/client/waiter.js +2 -2
  34. package/lib/client/webSocket.js +4 -22
  35. package/lib/generated/bindingsControllerSource.js +28 -0
  36. package/lib/generated/clockSource.js +1 -1
  37. package/lib/generated/injectedScriptSource.js +1 -1
  38. package/lib/generated/pollingRecorderSource.js +1 -1
  39. package/lib/generated/storageScriptSource.js +28 -0
  40. package/lib/generated/utilityScriptSource.js +1 -1
  41. package/lib/generated/webSocketMockSource.js +12 -50
  42. package/lib/inProcessFactory.js +9 -6
  43. package/lib/outofprocess.js +0 -2
  44. package/lib/protocol/validator.js +423 -346
  45. package/lib/protocol/validatorPrimitives.js +18 -4
  46. package/lib/remote/playwrightConnection.js +29 -166
  47. package/lib/remote/playwrightServer.js +233 -35
  48. package/lib/server/android/android.js +97 -83
  49. package/lib/server/android/backendAdb.js +0 -2
  50. package/lib/server/bidi/bidiBrowser.js +139 -73
  51. package/lib/server/bidi/bidiChromium.js +23 -22
  52. package/lib/server/bidi/bidiExecutionContext.js +2 -1
  53. package/lib/server/bidi/bidiFirefox.js +17 -14
  54. package/lib/server/bidi/bidiInput.js +22 -22
  55. package/lib/server/bidi/bidiNetworkManager.js +8 -11
  56. package/lib/server/bidi/bidiPage.js +42 -86
  57. package/lib/server/bidi/third_party/bidiProtocol.js +5 -133
  58. package/lib/server/bidi/third_party/bidiProtocolCore.js +179 -0
  59. package/lib/server/{dispatchers/selectorsDispatcher.js → bidi/third_party/bidiProtocolPermissions.js} +20 -18
  60. package/lib/server/browser.js +30 -21
  61. package/lib/server/browserContext.js +203 -165
  62. package/lib/server/browserType.js +109 -107
  63. package/lib/server/chromium/chromium.js +84 -69
  64. package/lib/server/chromium/chromiumSwitches.js +13 -20
  65. package/lib/server/chromium/crBrowser.js +74 -40
  66. package/lib/server/chromium/crConnection.js +8 -9
  67. package/lib/server/chromium/crCoverage.js +11 -8
  68. package/lib/server/chromium/crDragDrop.js +25 -20
  69. package/lib/server/chromium/crExecutionContext.js +2 -1
  70. package/lib/server/chromium/crInput.js +32 -29
  71. package/lib/server/chromium/crNetworkManager.js +45 -33
  72. package/lib/server/chromium/crPage.js +98 -73
  73. package/lib/server/chromium/crServiceWorker.js +13 -18
  74. package/lib/server/chromium/videoRecorder.js +10 -18
  75. package/lib/server/clock.js +51 -39
  76. package/lib/server/codegen/csharp.js +10 -5
  77. package/lib/server/codegen/java.js +1 -1
  78. package/lib/server/codegen/javascript.js +1 -1
  79. package/lib/server/codegen/jsonl.js +2 -1
  80. package/lib/server/codegen/language.js +22 -1
  81. package/lib/server/codegen/languages.js +4 -4
  82. package/lib/server/codegen/python.js +1 -1
  83. package/lib/server/cookieStore.js +3 -1
  84. package/lib/server/debugController.js +105 -71
  85. package/lib/server/debugger.js +6 -23
  86. package/lib/server/deviceDescriptorsSource.json +237 -127
  87. package/lib/server/dialog.js +50 -6
  88. package/lib/server/dispatchers/androidDispatcher.js +77 -62
  89. package/lib/server/dispatchers/artifactDispatcher.js +18 -18
  90. package/lib/server/dispatchers/browserContextDispatcher.js +141 -91
  91. package/lib/server/dispatchers/browserDispatcher.js +55 -88
  92. package/lib/server/dispatchers/browserTypeDispatcher.js +18 -9
  93. package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -4
  94. package/lib/server/dispatchers/debugControllerDispatcher.js +12 -21
  95. package/lib/server/dispatchers/dialogDispatcher.js +4 -4
  96. package/lib/server/dispatchers/dispatcher.js +78 -53
  97. package/lib/server/dispatchers/electronDispatcher.js +19 -20
  98. package/lib/server/dispatchers/elementHandlerDispatcher.js +83 -93
  99. package/lib/server/dispatchers/frameDispatcher.js +99 -102
  100. package/lib/server/dispatchers/jsHandleDispatcher.js +21 -16
  101. package/lib/server/dispatchers/jsonPipeDispatcher.js +4 -4
  102. package/lib/server/dispatchers/localUtilsDispatcher.js +53 -59
  103. package/lib/server/dispatchers/networkDispatchers.js +41 -35
  104. package/lib/server/dispatchers/pageDispatcher.js +156 -107
  105. package/lib/server/dispatchers/playwrightDispatcher.js +37 -25
  106. package/lib/server/dispatchers/streamDispatcher.js +15 -8
  107. package/lib/server/dispatchers/tracingDispatcher.js +22 -13
  108. package/lib/server/dispatchers/webSocketRouteDispatcher.js +46 -35
  109. package/lib/server/dispatchers/writableStreamDispatcher.js +16 -10
  110. package/lib/server/dom.js +198 -266
  111. package/lib/server/download.js +3 -3
  112. package/lib/server/electron/electron.js +96 -103
  113. package/lib/server/electron/loader.js +1 -1
  114. package/lib/server/fetch.js +22 -41
  115. package/lib/server/fileUploadUtils.js +1 -1
  116. package/lib/server/firefox/ffBrowser.js +79 -55
  117. package/lib/server/firefox/ffExecutionContext.js +2 -1
  118. package/lib/server/firefox/ffInput.js +23 -23
  119. package/lib/server/firefox/ffNetworkManager.js +8 -6
  120. package/lib/server/firefox/ffPage.js +39 -36
  121. package/lib/server/firefox/firefox.js +9 -10
  122. package/lib/server/frameSelectors.js +65 -22
  123. package/lib/server/frames.js +516 -544
  124. package/lib/server/har/harRecorder.js +1 -1
  125. package/lib/server/har/harTracer.js +4 -2
  126. package/lib/server/helper.js +3 -7
  127. package/lib/server/index.js +0 -3
  128. package/lib/server/input.js +47 -54
  129. package/lib/server/instrumentation.js +8 -14
  130. package/lib/server/javascript.js +9 -17
  131. package/lib/server/launchApp.js +48 -30
  132. package/lib/server/localUtils.js +45 -38
  133. package/lib/server/network.js +44 -10
  134. package/lib/server/page.js +233 -178
  135. package/lib/server/pageBinding.js +6 -7
  136. package/lib/server/playwright.js +4 -14
  137. package/lib/server/progress.js +57 -49
  138. package/lib/server/recorder/recorderApp.js +298 -95
  139. package/lib/server/recorder/recorderRunner.js +23 -24
  140. package/lib/server/recorder/recorderSignalProcessor.js +83 -0
  141. package/lib/server/recorder/recorderUtils.js +67 -10
  142. package/lib/server/recorder.js +284 -146
  143. package/lib/server/registry/index.js +83 -48
  144. package/lib/server/registry/nativeDeps.js +175 -0
  145. package/lib/server/registry/oopDownloadBrowserMain.js +1 -1
  146. package/lib/server/screenshotter.js +84 -83
  147. package/lib/server/selectors.js +12 -12
  148. package/lib/server/socksClientCertificatesInterceptor.js +198 -136
  149. package/lib/server/trace/recorder/snapshotter.js +12 -19
  150. package/lib/server/trace/recorder/tracing.js +36 -27
  151. package/lib/server/trace/viewer/traceViewer.js +11 -20
  152. package/lib/server/transport.js +20 -22
  153. package/lib/server/utils/comparators.js +2 -2
  154. package/lib/server/utils/debug.js +3 -8
  155. package/lib/server/utils/debugLogger.js +8 -0
  156. package/lib/server/utils/hostPlatform.js +3 -1
  157. package/lib/server/utils/network.js +35 -25
  158. package/lib/server/utils/nodePlatform.js +1 -1
  159. package/lib/server/utils/processLauncher.js +4 -1
  160. package/lib/server/utils/wsServer.js +11 -17
  161. package/lib/server/webkit/webkit.js +5 -2
  162. package/lib/server/webkit/wkBrowser.js +51 -28
  163. package/lib/server/webkit/wkExecutionContext.js +2 -1
  164. package/lib/server/webkit/wkInput.js +25 -25
  165. package/lib/server/webkit/wkInterceptableRequest.js +1 -1
  166. package/lib/server/webkit/wkPage.js +80 -59
  167. package/lib/server/webkit/wkProvisionalPage.js +1 -1
  168. package/lib/server/webkit/wkWorkers.js +7 -7
  169. package/lib/utils/isomorphic/ariaSnapshot.js +13 -7
  170. package/lib/utils/isomorphic/cssParser.js +1 -2
  171. package/lib/utils/isomorphic/locatorGenerators.js +18 -0
  172. package/lib/utils/isomorphic/manualPromise.js +1 -2
  173. package/lib/utils/isomorphic/mimeType.js +1 -2
  174. package/lib/utils/isomorphic/multimap.js +1 -2
  175. package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +248 -0
  176. package/lib/utils/isomorphic/protocolFormatter.js +78 -0
  177. package/lib/utils/isomorphic/protocolMetainfo.js +318 -0
  178. package/lib/utils/isomorphic/selectorParser.js +3 -4
  179. package/lib/utils/isomorphic/stringUtils.js +3 -24
  180. package/lib/utils/isomorphic/time.js +9 -4
  181. package/lib/utils/isomorphic/timeoutRunner.js +3 -4
  182. package/lib/utils/isomorphic/traceUtils.js +2 -3
  183. package/lib/utils/isomorphic/urlMatch.js +21 -7
  184. package/lib/utils/isomorphic/utilityScriptSerializers.js +208 -205
  185. package/lib/utils.js +8 -2
  186. package/lib/utilsBundleImpl/index.js +160 -150
  187. package/lib/vite/htmlReport/index.html +17 -17
  188. package/lib/vite/recorder/assets/{codeMirrorModule-CXVeovup.js → codeMirrorModule-DzQ0k89p.js} +1 -1
  189. package/lib/vite/recorder/assets/{index-eHBmevrY.css → index-CI4HQ-Zb.css} +1 -1
  190. package/lib/vite/recorder/assets/index-D7C7daHH.js +184 -0
  191. package/lib/vite/recorder/index.html +3 -3
  192. package/lib/vite/traceViewer/assets/{codeMirrorModule-_GLjJL-7.js → codeMirrorModule-Di48jgWx.js} +1 -1
  193. package/lib/vite/traceViewer/assets/defaultSettingsView-szBn8781.js +256 -0
  194. package/lib/vite/traceViewer/defaultSettingsView.DVJHpiGt.css +1 -0
  195. package/lib/vite/traceViewer/index.BFsek2M6.css +1 -0
  196. package/lib/vite/traceViewer/index.DQvXoPLL.js +2 -0
  197. package/lib/vite/traceViewer/index.html +6 -6
  198. package/lib/vite/traceViewer/sw.bundle.js +3 -3
  199. package/lib/vite/traceViewer/uiMode.dBV3oN9h.js +5 -0
  200. package/lib/vite/traceViewer/uiMode.html +4 -4
  201. package/lib/zipBundleImpl.js +4 -4
  202. package/package.json +1 -1
  203. package/types/protocol.d.ts +712 -107
  204. package/types/types.d.ts +148 -37
  205. package/lib/generated/consoleApiSource.js +0 -28
  206. package/lib/protocol/debug.js +0 -211
  207. package/lib/server/recorder/contextRecorder.js +0 -286
  208. package/lib/server/recorder/recorderCollection.js +0 -116
  209. package/lib/server/recorder/recorderFrontend.js +0 -16
  210. package/lib/server/storageScript.js +0 -154
  211. package/lib/server/timeoutSettings.js +0 -89
  212. package/lib/utils/isomorphic/builtins.js +0 -86
  213. package/lib/vite/recorder/assets/index-BsWQsSGl.js +0 -184
  214. package/lib/vite/traceViewer/assets/defaultSettingsView-DtCQiGHe.js +0 -265
  215. package/lib/vite/traceViewer/defaultSettingsView.QdHITyLI.css +0 -1
  216. package/lib/vite/traceViewer/index.CFOW-Ezb.css +0 -1
  217. package/lib/vite/traceViewer/index.cFZzK9RN.js +0 -2
  218. package/lib/vite/traceViewer/uiMode.XVPIqBeS.js +0 -5
@@ -49,7 +49,7 @@ var import_zipBundle = require("../zipBundle");
49
49
  var import_traceUtils = require("../utils/isomorphic/traceUtils");
50
50
  var import_assert = require("../utils/isomorphic/assert");
51
51
  var import_fileUtils = require("./utils/fileUtils");
52
- async function zip(stackSessions, params) {
52
+ async function zip(progress, stackSessions, params) {
53
53
  const promise = new import_manualPromise.ManualPromise();
54
54
  const zipFile = new import_zipBundle.yazl.ZipFile();
55
55
  zipFile.on("error", (error) => promise.reject(error));
@@ -64,7 +64,7 @@ async function zip(stackSessions, params) {
64
64
  addFile(entry.value, entry.name);
65
65
  const stackSession = params.stacksId ? stackSessions.get(params.stacksId) : void 0;
66
66
  if (stackSession?.callStacks.length) {
67
- await stackSession.writer;
67
+ await progress.race(stackSession.writer);
68
68
  if (process.env.PW_LIVE_TRACE_STACKS) {
69
69
  zipFile.addFile(stackSession.file, "trace.stacks");
70
70
  } else {
@@ -84,16 +84,16 @@ async function zip(stackSessions, params) {
84
84
  addFile(sourceFile, "resources/src@" + await (0, import_crypto.calculateSha1)(sourceFile) + ".txt");
85
85
  }
86
86
  if (params.mode === "write") {
87
- await import_fs.default.promises.mkdir(import_path.default.dirname(params.zipFile), { recursive: true });
87
+ await progress.race(import_fs.default.promises.mkdir(import_path.default.dirname(params.zipFile), { recursive: true }));
88
88
  zipFile.end(void 0, () => {
89
89
  zipFile.outputStream.pipe(import_fs.default.createWriteStream(params.zipFile)).on("close", () => promise.resolve()).on("error", (error) => promise.reject(error));
90
90
  });
91
- await promise;
92
- await deleteStackSession(stackSessions, params.stacksId);
91
+ await progress.race(promise);
92
+ await deleteStackSession(progress, stackSessions, params.stacksId);
93
93
  return;
94
94
  }
95
95
  const tempFile = params.zipFile + ".tmp";
96
- await import_fs.default.promises.rename(params.zipFile, tempFile);
96
+ await progress.race(import_fs.default.promises.rename(params.zipFile, tempFile));
97
97
  import_zipBundle.yauzl.open(tempFile, (err, inZipFile) => {
98
98
  if (err) {
99
99
  promise.reject(err);
@@ -120,74 +120,81 @@ async function zip(stackSessions, params) {
120
120
  });
121
121
  });
122
122
  });
123
- await promise;
124
- await deleteStackSession(stackSessions, params.stacksId);
123
+ await progress.race(promise);
124
+ await deleteStackSession(progress, stackSessions, params.stacksId);
125
125
  }
126
- async function deleteStackSession(stackSessions, stacksId) {
126
+ async function deleteStackSession(progress, stackSessions, stacksId) {
127
127
  const session = stacksId ? stackSessions.get(stacksId) : void 0;
128
128
  if (!session)
129
129
  return;
130
- await session.writer;
131
- if (session.tmpDir)
132
- await (0, import_fileUtils.removeFolders)([session.tmpDir]);
133
130
  stackSessions.delete(stacksId);
131
+ if (session.tmpDir)
132
+ await progress.race((0, import_fileUtils.removeFolders)([session.tmpDir]));
134
133
  }
135
- async function harOpen(harBackends, params) {
134
+ async function harOpen(progress, harBackends, params) {
136
135
  let harBackend;
137
136
  if (params.file.endsWith(".zip")) {
138
137
  const zipFile = new import_zipFile.ZipFile(params.file);
139
- const entryNames = await zipFile.entries();
140
- const harEntryName = entryNames.find((e) => e.endsWith(".har"));
141
- if (!harEntryName)
142
- return { error: "Specified archive does not have a .har file" };
143
- const har = await zipFile.read(harEntryName);
144
- const harFile = JSON.parse(har.toString());
145
- harBackend = new import_harBackend.HarBackend(harFile, null, zipFile);
138
+ try {
139
+ const entryNames = await progress.race(zipFile.entries());
140
+ const harEntryName = entryNames.find((e) => e.endsWith(".har"));
141
+ if (!harEntryName)
142
+ return { error: "Specified archive does not have a .har file" };
143
+ const har = await progress.race(zipFile.read(harEntryName));
144
+ const harFile = JSON.parse(har.toString());
145
+ harBackend = new import_harBackend.HarBackend(harFile, null, zipFile);
146
+ } catch (error) {
147
+ zipFile.close();
148
+ throw error;
149
+ }
146
150
  } else {
147
- const harFile = JSON.parse(await import_fs.default.promises.readFile(params.file, "utf-8"));
151
+ const harFile = JSON.parse(await progress.race(import_fs.default.promises.readFile(params.file, "utf-8")));
148
152
  harBackend = new import_harBackend.HarBackend(harFile, import_path.default.dirname(params.file), null);
149
153
  }
150
154
  harBackends.set(harBackend.id, harBackend);
151
155
  return { harId: harBackend.id };
152
156
  }
153
- async function harLookup(harBackends, params) {
157
+ async function harLookup(progress, harBackends, params) {
154
158
  const harBackend = harBackends.get(params.harId);
155
159
  if (!harBackend)
156
160
  return { action: "error", message: `Internal error: har was not opened` };
157
- return await harBackend.lookup(params.url, params.method, params.headers, params.postData, params.isNavigationRequest);
161
+ return await progress.race(harBackend.lookup(params.url, params.method, params.headers, params.postData, params.isNavigationRequest));
158
162
  }
159
- async function harClose(harBackends, params) {
163
+ function harClose(harBackends, params) {
160
164
  const harBackend = harBackends.get(params.harId);
161
165
  if (harBackend) {
162
166
  harBackends.delete(harBackend.id);
163
167
  harBackend.dispose();
164
168
  }
165
169
  }
166
- async function harUnzip(params) {
170
+ async function harUnzip(progress, params) {
167
171
  const dir = import_path.default.dirname(params.zipFile);
168
172
  const zipFile = new import_zipFile.ZipFile(params.zipFile);
169
- for (const entry of await zipFile.entries()) {
170
- const buffer = await zipFile.read(entry);
171
- if (entry === "har.har")
172
- await import_fs.default.promises.writeFile(params.harFile, buffer);
173
- else
174
- await import_fs.default.promises.writeFile(import_path.default.join(dir, entry), buffer);
173
+ try {
174
+ for (const entry of await progress.race(zipFile.entries())) {
175
+ const buffer = await progress.race(zipFile.read(entry));
176
+ if (entry === "har.har")
177
+ await progress.race(import_fs.default.promises.writeFile(params.harFile, buffer));
178
+ else
179
+ await progress.race(import_fs.default.promises.writeFile(import_path.default.join(dir, entry), buffer));
180
+ }
181
+ await progress.race(import_fs.default.promises.unlink(params.zipFile));
182
+ } finally {
183
+ zipFile.close();
175
184
  }
176
- zipFile.close();
177
- await import_fs.default.promises.unlink(params.zipFile);
178
185
  }
179
- async function tracingStarted(stackSessions, params) {
186
+ async function tracingStarted(progress, stackSessions, params) {
180
187
  let tmpDir = void 0;
181
188
  if (!params.tracesDir)
182
- tmpDir = await import_fs.default.promises.mkdtemp(import_path.default.join(import_os.default.tmpdir(), "playwright-tracing-"));
189
+ tmpDir = await progress.race(import_fs.default.promises.mkdtemp(import_path.default.join(import_os.default.tmpdir(), "playwright-tracing-")));
183
190
  const traceStacksFile = import_path.default.join(params.tracesDir || tmpDir, params.traceName + ".stacks");
184
191
  stackSessions.set(traceStacksFile, { callStacks: [], file: traceStacksFile, writer: Promise.resolve(), tmpDir });
185
192
  return { stacksId: traceStacksFile };
186
193
  }
187
- async function traceDiscarded(stackSessions, params) {
188
- await deleteStackSession(stackSessions, params.stacksId);
194
+ async function traceDiscarded(progress, stackSessions, params) {
195
+ await deleteStackSession(progress, stackSessions, params.stacksId);
189
196
  }
190
- async function addStackToTracingNoReply(stackSessions, params) {
197
+ function addStackToTracingNoReply(stackSessions, params) {
191
198
  for (const session of stackSessions.values()) {
192
199
  session.callStacks.push(params.callData);
193
200
  if (process.env.PW_LIVE_TRACE_STACKS) {
@@ -23,6 +23,7 @@ __export(network_exports, {
23
23
  Route: () => Route,
24
24
  WebSocket: () => WebSocket,
25
25
  filterCookies: () => filterCookies,
26
+ isLocalHostname: () => isLocalHostname,
26
27
  kMaxCookieExpiresDateInSeconds: () => kMaxCookieExpiresDateInSeconds,
27
28
  mergeHeaders: () => mergeHeaders,
28
29
  parseURL: () => parseURL,
@@ -50,13 +51,16 @@ function filterCookies(cookies, urls) {
50
51
  continue;
51
52
  if (!parsedURL.pathname.startsWith(c.path))
52
53
  continue;
53
- if (parsedURL.protocol !== "https:" && parsedURL.hostname !== "localhost" && c.secure)
54
+ if (parsedURL.protocol !== "https:" && !isLocalHostname(parsedURL.hostname) && c.secure)
54
55
  continue;
55
56
  return true;
56
57
  }
57
58
  return false;
58
59
  });
59
60
  }
61
+ function isLocalHostname(hostname) {
62
+ return hostname === "localhost" || hostname.endsWith(".localhost");
63
+ }
60
64
  const kMaxCookieExpiresDateInSeconds = 253402300799;
61
65
  function rewriteCookies(cookies) {
62
66
  return cookies.map((c) => {
@@ -121,16 +125,17 @@ class Request extends import_instrumentation.SdkObject {
121
125
  this._failureText = failureText;
122
126
  this._waitForResponsePromise.resolve(null);
123
127
  }
124
- _setOverrides(overrides) {
125
- this._overrides = overrides;
128
+ _applyOverrides(overrides) {
129
+ this._overrides = { ...this._overrides, ...overrides };
126
130
  this._updateHeadersMap();
131
+ return this._overrides;
127
132
  }
128
133
  _updateHeadersMap() {
129
134
  for (const { name, value } of this.headers())
130
135
  this._headersMap.set(name.toLowerCase(), value);
131
136
  }
132
- _hasOverrides() {
133
- return !!this._overrides;
137
+ overrides() {
138
+ return this._overrides;
134
139
  }
135
140
  url() {
136
141
  return this._overrides?.url || this._url;
@@ -212,10 +217,24 @@ class Route extends import_instrumentation.SdkObject {
212
217
  constructor(request, delegate) {
213
218
  super(request._frame || request._context, "route");
214
219
  this._handled = false;
220
+ this._futureHandlers = [];
215
221
  this._request = request;
216
222
  this._delegate = delegate;
217
223
  this._request._context.addRouteInFlight(this);
218
224
  }
225
+ handle(handlers) {
226
+ this._futureHandlers = [...handlers];
227
+ this.continue({ isFallback: true }).catch(() => {
228
+ });
229
+ }
230
+ async removeHandler(handler) {
231
+ this._futureHandlers = this._futureHandlers.filter((h) => h !== handler);
232
+ if (handler === this._currentHandler) {
233
+ await this.continue({ isFallback: true }).catch(() => {
234
+ });
235
+ return;
236
+ }
237
+ }
219
238
  request() {
220
239
  return this._request;
221
240
  }
@@ -225,10 +244,11 @@ class Route extends import_instrumentation.SdkObject {
225
244
  await this._delegate.abort(errorCode);
226
245
  this._endHandling();
227
246
  }
228
- async redirectNavigationRequest(url) {
247
+ redirectNavigationRequest(url) {
229
248
  this._startHandling();
230
249
  (0, import_utils.assert)(this._request.isNavigationRequest());
231
250
  this._request.frame().redirectNavigation(url, this._request._documentId, this._request.headerValue("referer"));
251
+ this._endHandling();
232
252
  }
233
253
  async fulfill(overrides) {
234
254
  this._startHandling();
@@ -274,26 +294,39 @@ class Route extends import_instrumentation.SdkObject {
274
294
  headers.push({ name: "vary", value: "Origin" });
275
295
  }
276
296
  async continue(overrides) {
277
- this._startHandling();
278
297
  if (overrides.url) {
279
298
  const newUrl = new URL(overrides.url);
280
299
  const oldUrl = new URL(this._request.url());
281
300
  if (oldUrl.protocol !== newUrl.protocol)
282
301
  throw new Error("New URL must have same protocol as overridden URL");
283
302
  }
284
- if (overrides.headers)
285
- overrides.headers = overrides.headers?.filter((header) => header.name.toLowerCase() !== "cookie");
286
- this._request._setOverrides(overrides);
303
+ if (overrides.headers) {
304
+ overrides.headers = overrides.headers?.filter((header) => {
305
+ const headerName = header.name.toLowerCase();
306
+ return headerName !== "cookie" && headerName !== "host";
307
+ });
308
+ }
309
+ overrides = this._request._applyOverrides(overrides);
310
+ const nextHandler = this._futureHandlers.shift();
311
+ if (nextHandler) {
312
+ this._currentHandler = nextHandler;
313
+ nextHandler(this, this._request);
314
+ return;
315
+ }
287
316
  if (!overrides.isFallback)
288
317
  this._request._context.emit(import_browserContext.BrowserContext.Events.RequestContinued, this._request);
318
+ this._startHandling();
289
319
  await this._delegate.continue(overrides);
290
320
  this._endHandling();
291
321
  }
292
322
  _startHandling() {
293
323
  (0, import_utils.assert)(!this._handled, "Route is already handled!");
294
324
  this._handled = true;
325
+ this._currentHandler = void 0;
295
326
  }
296
327
  _endHandling() {
328
+ this._futureHandlers = [];
329
+ this._currentHandler = void 0;
297
330
  this._request._context.removeRouteInFlight(this);
298
331
  }
299
332
  }
@@ -573,6 +606,7 @@ function mergeHeaders(headers) {
573
606
  Route,
574
607
  WebSocket,
575
608
  filterCookies,
609
+ isLocalHostname,
576
610
  kMaxCookieExpiresDateInSeconds,
577
611
  mergeHeaders,
578
612
  parseURL,