patchright-core 1.51.3 → 1.52.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.
- package/browsers.json +15 -13
- package/lib/androidServerImpl.js +42 -48
- package/lib/browserServerImpl.js +54 -67
- package/lib/cli/driver.js +71 -69
- package/lib/cli/program.js +312 -328
- package/lib/cli/programWithTestStub.js +51 -45
- package/lib/client/accessibility.js +31 -32
- package/lib/client/android.js +141 -228
- package/lib/client/api.js +135 -283
- package/lib/client/artifact.js +39 -36
- package/lib/client/browser.js +57 -61
- package/lib/client/browserContext.js +297 -326
- package/lib/client/browserType.js +92 -106
- package/lib/client/cdpSession.js +29 -31
- package/lib/client/channelOwner.js +82 -95
- package/lib/client/clientHelper.js +46 -38
- package/lib/client/clientInstrumentation.js +40 -37
- package/lib/client/clientStackTrace.js +41 -37
- package/lib/client/clock.js +36 -36
- package/lib/client/connection.js +190 -212
- package/lib/client/consoleMessage.js +31 -28
- package/lib/client/coverage.js +25 -22
- package/lib/client/dialog.js +30 -31
- package/lib/client/download.js +25 -25
- package/lib/client/electron.js +73 -75
- package/lib/client/elementHandle.js +111 -147
- package/lib/client/errors.js +53 -53
- package/lib/client/eventEmitter.js +124 -121
- package/lib/client/events.js +72 -68
- package/lib/client/fetch.js +135 -158
- package/lib/client/fileChooser.js +25 -24
- package/lib/client/fileUtils.js +31 -28
- package/lib/client/frame.js +187 -306
- package/lib/client/harRouter.js +42 -52
- package/lib/client/input.js +40 -69
- package/lib/client/jsHandle.js +54 -69
- package/lib/client/jsonPipe.js +27 -23
- package/lib/client/localUtils.js +29 -28
- package/lib/client/locator.js +161 -245
- package/lib/client/network.js +277 -295
- package/lib/client/page.js +270 -318
- package/lib/client/platform.js +46 -43
- package/lib/client/playwright.js +51 -66
- package/lib/client/selectors.js +48 -46
- package/lib/client/stream.js +29 -25
- package/lib/client/timeoutSettings.js +49 -39
- package/lib/client/tracing.js +48 -84
- package/lib/client/types.js +26 -22
- package/lib/client/video.js +35 -27
- package/lib/client/waiter.js +69 -88
- package/lib/client/webError.js +25 -23
- package/lib/client/webSocket.js +61 -56
- package/lib/client/worker.js +48 -58
- package/lib/client/writableStream.js +27 -23
- package/lib/generated/clockSource.js +26 -5
- package/lib/generated/consoleApiSource.js +26 -5
- package/lib/generated/injectedScriptSource.js +26 -5
- package/lib/generated/pollingRecorderSource.js +26 -5
- package/lib/generated/utilityScriptSource.js +26 -5
- package/lib/generated/webSocketMockSource.js +375 -4
- package/lib/inProcessFactory.js +53 -53
- package/lib/inprocess.js +2 -19
- package/lib/outofprocess.js +53 -46
- package/lib/protocol/debug.js +209 -25
- package/lib/protocol/serializers.js +153 -134
- package/lib/protocol/validator.js +2714 -2714
- package/lib/protocol/validatorPrimitives.js +114 -73
- package/lib/remote/playwrightConnection.js +140 -157
- package/lib/remote/playwrightServer.js +99 -84
- package/lib/server/accessibility.js +44 -37
- package/lib/server/android/android.js +216 -209
- package/lib/server/android/backendAdb.js +89 -82
- package/lib/server/artifact.js +78 -55
- package/lib/server/bidi/bidiBrowser.js +221 -155
- package/lib/server/bidi/bidiChromium.js +106 -79
- package/lib/server/bidi/bidiConnection.js +66 -83
- package/lib/server/bidi/bidiExecutionContext.js +128 -113
- package/lib/server/bidi/bidiFirefox.js +76 -69
- package/lib/server/bidi/bidiInput.js +86 -97
- package/lib/server/bidi/bidiNetworkManager.js +137 -154
- package/lib/server/bidi/bidiOverCdp.js +57 -58
- package/lib/server/bidi/bidiPage.js +247 -219
- package/lib/server/bidi/bidiPdf.js +52 -86
- package/lib/server/bidi/third_party/bidiCommands.d.js +22 -0
- package/lib/server/bidi/third_party/bidiDeserializer.js +55 -50
- package/lib/server/bidi/third_party/bidiKeyboard.js +236 -220
- package/lib/server/bidi/third_party/bidiProtocol.js +144 -131
- package/lib/server/bidi/third_party/bidiSerializer.js +67 -63
- package/lib/server/bidi/third_party/firefoxPrefs.js +141 -119
- package/lib/server/browser.js +76 -84
- package/lib/server/browserContext.js +321 -346
- package/lib/server/browserType.js +169 -182
- package/lib/server/callLog.js +47 -44
- package/lib/server/chromium/chromium.js +212 -190
- package/lib/server/chromium/chromiumSwitches.js +86 -64
- package/lib/server/chromium/crAccessibility.js +157 -131
- package/lib/server/chromium/crBrowser.js +253 -273
- package/lib/server/chromium/crConnection.js +91 -116
- package/lib/server/chromium/crCoverage.js +113 -127
- package/lib/server/chromium/crDevTools.js +59 -51
- package/lib/server/chromium/crDragDrop.js +62 -79
- package/lib/server/chromium/crExecutionContext.js +88 -83
- package/lib/server/chromium/crInput.js +97 -95
- package/lib/server/chromium/crNetworkManager.js +284 -404
- package/lib/server/chromium/crPage.js +522 -608
- package/lib/server/chromium/crPdf.js +54 -86
- package/lib/server/chromium/crProtocolHelper.js +92 -80
- package/lib/server/chromium/crServiceWorker.js +82 -67
- package/lib/server/chromium/defaultFontFamilies.js +152 -135
- package/lib/server/chromium/protocol.d.js +16 -0
- package/lib/server/chromium/videoRecorder.js +65 -99
- package/lib/server/clock.js +62 -50
- package/lib/server/codegen/csharp.js +185 -160
- package/lib/server/codegen/java.js +155 -128
- package/lib/server/codegen/javascript.js +163 -148
- package/lib/server/codegen/jsonl.js +32 -28
- package/lib/server/codegen/language.js +75 -52
- package/lib/server/codegen/languages.js +65 -27
- package/lib/server/codegen/python.js +140 -125
- package/lib/server/codegen/types.js +15 -4
- package/lib/server/console.js +28 -32
- package/lib/server/cookieStore.js +105 -86
- package/lib/server/debugController.js +97 -124
- package/lib/server/debugger.js +82 -78
- package/lib/server/deviceDescriptors.js +37 -24
- package/lib/server/deviceDescriptorsSource.json +50 -50
- package/lib/server/dialog.js +36 -35
- package/lib/server/dispatchers/androidDispatcher.js +196 -107
- package/lib/server/dispatchers/artifactDispatcher.js +62 -62
- package/lib/server/dispatchers/browserContextDispatcher.js +176 -205
- package/lib/server/dispatchers/browserDispatcher.js +78 -97
- package/lib/server/dispatchers/browserTypeDispatcher.js +35 -35
- package/lib/server/dispatchers/cdpSessionDispatcher.js +32 -36
- package/lib/server/dispatchers/debugControllerDispatcher.js +48 -66
- package/lib/server/dispatchers/dialogDispatcher.js +30 -27
- package/lib/server/dispatchers/dispatcher.js +169 -220
- package/lib/server/dispatchers/electronDispatcher.js +54 -57
- package/lib/server/dispatchers/elementHandlerDispatcher.js +77 -119
- package/lib/server/dispatchers/frameDispatcher.js +99 -163
- package/lib/server/dispatchers/jsHandleDispatcher.js +49 -66
- package/lib/server/dispatchers/jsonPipeDispatcher.js +35 -36
- package/lib/server/dispatchers/localUtilsDispatcher.js +95 -80
- package/lib/server/dispatchers/networkDispatchers.js +90 -107
- package/lib/server/dispatchers/pageDispatcher.js +128 -169
- package/lib/server/dispatchers/playwrightDispatcher.js +69 -76
- package/lib/server/dispatchers/selectorsDispatcher.js +28 -24
- package/lib/server/dispatchers/streamDispatcher.js +42 -45
- package/lib/server/dispatchers/tracingDispatcher.js +36 -41
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +96 -131
- package/lib/server/dispatchers/writableStreamDispatcher.js +54 -38
- package/lib/server/dom.js +413 -443
- package/lib/server/download.js +45 -35
- package/lib/server/electron/electron.js +156 -176
- package/lib/server/electron/loader.js +8 -36
- package/lib/server/errors.js +47 -46
- package/lib/server/fetch.js +289 -323
- package/lib/server/fileChooser.js +25 -24
- package/lib/server/fileUploadUtils.js +65 -59
- package/lib/server/firefox/ffAccessibility.js +153 -131
- package/lib/server/firefox/ffBrowser.js +213 -277
- package/lib/server/firefox/ffConnection.js +63 -84
- package/lib/server/firefox/ffExecutionContext.js +91 -73
- package/lib/server/firefox/ffInput.js +67 -69
- package/lib/server/firefox/ffNetworkManager.js +131 -110
- package/lib/server/firefox/ffPage.js +236 -273
- package/lib/server/firefox/firefox.js +76 -67
- package/lib/server/firefox/protocol.d.js +16 -0
- package/lib/server/formData.js +107 -35
- package/lib/server/frameSelectors.js +77 -111
- package/lib/server/frames.js +730 -894
- package/lib/server/har/harRecorder.js +85 -77
- package/lib/server/har/harTracer.js +287 -222
- package/lib/server/harBackend.js +80 -80
- package/lib/server/helper.js +56 -59
- package/lib/server/index.js +59 -99
- package/lib/server/input.js +134 -163
- package/lib/server/instrumentation.js +49 -44
- package/lib/server/javascript.js +143 -134
- package/lib/server/launchApp.js +92 -73
- package/lib/server/localUtils.js +130 -122
- package/lib/server/macEditingCommands.js +141 -137
- package/lib/server/network.js +262 -296
- package/lib/server/page.js +329 -426
- package/lib/server/pageBinding.js +88 -0
- package/lib/server/pipeTransport.js +49 -45
- package/lib/server/playwright.js +60 -67
- package/lib/server/progress.js +56 -51
- package/lib/server/protocolError.js +34 -31
- package/lib/server/recorder/chat.js +70 -86
- package/lib/server/recorder/contextRecorder.js +134 -138
- package/lib/server/recorder/recorderApp.js +127 -136
- package/lib/server/recorder/recorderCollection.js +56 -44
- package/lib/server/recorder/recorderFrontend.js +15 -4
- package/lib/server/recorder/recorderRunner.js +79 -103
- package/lib/server/recorder/recorderUtils.js +56 -45
- package/lib/server/recorder/throttledFile.js +42 -30
- package/lib/server/recorder.js +177 -186
- package/lib/server/registry/browserFetcher.js +106 -101
- package/lib/server/registry/dependencies.js +245 -196
- package/lib/server/registry/index.js +904 -792
- package/lib/server/registry/nativeDeps.js +1073 -464
- package/lib/server/registry/oopDownloadBrowserMain.js +57 -75
- package/lib/server/screenshotter.js +166 -182
- package/lib/server/selectors.js +85 -46
- package/lib/server/socksClientCertificatesInterceptor.js +166 -185
- package/lib/server/socksInterceptor.js +62 -70
- package/lib/server/storageScript.js +94 -100
- package/lib/server/timeoutSettings.js +58 -43
- package/lib/server/trace/recorder/snapshotter.js +70 -89
- package/lib/server/trace/recorder/snapshotterInjected.js +238 -217
- package/lib/server/trace/recorder/tracing.js +321 -333
- package/lib/server/trace/test/inMemorySnapshotter.js +46 -52
- package/lib/server/trace/viewer/traceViewer.js +168 -146
- package/lib/server/transport.js +124 -133
- package/lib/server/types.js +26 -22
- package/lib/server/usKeyboardLayout.js +135 -545
- package/lib/server/utils/ascii.js +39 -26
- package/lib/server/utils/comparators.js +105 -103
- package/lib/server/utils/crypto.js +157 -112
- package/lib/server/utils/debug.js +37 -28
- package/lib/server/utils/debugLogger.js +69 -48
- package/lib/server/utils/env.js +52 -37
- package/lib/server/utils/eventsHelper.js +29 -28
- package/lib/server/utils/expectUtils.js +31 -26
- package/lib/server/utils/fileUtils.js +123 -136
- package/lib/server/utils/happyEyeballs.js +138 -123
- package/lib/server/utils/hostPlatform.js +84 -120
- package/lib/server/utils/httpServer.js +106 -121
- package/lib/server/utils/image_tools/colorUtils.js +42 -51
- package/lib/server/utils/image_tools/compare.js +44 -43
- package/lib/server/utils/image_tools/imageChannel.js +38 -30
- package/lib/server/utils/image_tools/stats.js +40 -40
- package/lib/server/utils/linuxUtils.js +50 -37
- package/lib/server/utils/network.js +143 -86
- package/lib/server/utils/nodePlatform.js +87 -79
- package/lib/server/utils/pipeTransport.js +44 -42
- package/lib/server/utils/processLauncher.js +111 -121
- package/lib/server/utils/profiler.js +52 -39
- package/lib/server/utils/socksProxy.js +280 -339
- package/lib/server/utils/spawnAsync.js +37 -41
- package/lib/server/utils/task.js +31 -38
- package/lib/server/utils/userAgent.js +73 -66
- package/lib/server/utils/wsServer.js +73 -69
- package/lib/server/utils/zipFile.js +36 -37
- package/lib/server/utils/zones.js +37 -34
- package/lib/server/webkit/protocol.d.js +16 -0
- package/lib/server/webkit/webkit.js +76 -63
- package/lib/server/webkit/wkAccessibility.js +161 -118
- package/lib/server/webkit/wkBrowser.js +159 -176
- package/lib/server/webkit/wkConnection.js +59 -83
- package/lib/server/webkit/wkExecutionContext.js +84 -70
- package/lib/server/webkit/wkInput.js +82 -80
- package/lib/server/webkit/wkInterceptableRequest.js +102 -95
- package/lib/server/webkit/wkPage.js +525 -619
- package/lib/server/webkit/wkProvisionalPage.js +45 -56
- package/lib/server/webkit/wkWorkers.js +77 -77
- package/lib/utils/isomorphic/ariaSnapshot.js +144 -152
- package/lib/utils/isomorphic/assert.js +28 -22
- package/lib/utils/isomorphic/builtins.js +90 -0
- package/lib/utils/isomorphic/colors.js +66 -59
- package/lib/utils/isomorphic/cssParser.js +121 -125
- package/lib/utils/isomorphic/cssTokenizer.js +436 -364
- package/lib/utils/isomorphic/headers.js +38 -37
- package/lib/utils/isomorphic/locatorGenerators.js +340 -357
- package/lib/utils/isomorphic/locatorParser.js +96 -105
- package/lib/utils/isomorphic/locatorUtils.js +63 -44
- package/lib/utils/isomorphic/manualPromise.js +47 -39
- package/lib/utils/isomorphic/mimeType.js +448 -25
- package/lib/utils/isomorphic/multimap.js +35 -27
- package/lib/utils/isomorphic/rtti.js +35 -33
- package/lib/utils/isomorphic/selectorParser.js +183 -193
- package/lib/utils/isomorphic/semaphore.js +27 -24
- package/lib/utils/isomorphic/stackTrace.js +87 -98
- package/lib/utils/isomorphic/stringUtils.js +113 -106
- package/lib/utils/isomorphic/time.js +41 -22
- package/lib/utils/isomorphic/timeoutRunner.js +55 -54
- package/lib/utils/isomorphic/traceUtils.js +38 -41
- package/lib/utils/isomorphic/types.js +15 -4
- package/lib/utils/isomorphic/urlMatch.js +112 -67
- package/lib/utils/isomorphic/utilityScriptSerializers.js +248 -0
- package/lib/utils.js +97 -443
- package/lib/utilsBundle.js +101 -52
- package/lib/vite/htmlReport/index.html +21 -15
- package/lib/vite/recorder/assets/{codeMirrorModule-B9YMkrwa.js → codeMirrorModule-DVQi6prl.js} +1 -1
- package/lib/vite/recorder/assets/index-97EUAAbk.js +184 -0
- package/lib/vite/recorder/index.html +1 -1
- package/lib/vite/traceViewer/assets/{codeMirrorModule-1DiydmYA.js → codeMirrorModule-dvXVzLxY.js} +1 -1
- package/lib/vite/traceViewer/assets/defaultSettingsView-BjymbO6M.js +265 -0
- package/lib/vite/traceViewer/{defaultSettingsView.5fN5lw10.css → defaultSettingsView.QdHITyLI.css} +1 -1
- package/lib/vite/traceViewer/index.ChIUCJnj.js +2 -0
- package/lib/vite/traceViewer/index.html +3 -3
- package/lib/vite/traceViewer/sw.bundle.js +3 -3
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/lib/vite/traceViewer/uiMode.jUCiCtdp.js +5 -0
- package/lib/zipBundle.js +32 -23
- package/package.json +1 -1
- package/types/protocol.d.ts +436 -17
- package/types/types.d.ts +35 -16
- package/lib/server/isomorphic/utilityScriptSerializers.js +0 -229
- package/lib/vite/recorder/assets/index-ELPgmkwA.js +0 -184
- package/lib/vite/traceViewer/assets/defaultSettingsView-l0TyP_G8.js +0 -259
- package/lib/vite/traceViewer/index.BqUZLSro.js +0 -2
- package/lib/vite/traceViewer/uiMode.C1d2m5sF.js +0 -5
|
@@ -1,99 +1,99 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.
|
|
4
|
-
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var screenshotter_exports = {};
|
|
20
|
+
__export(screenshotter_exports, {
|
|
21
|
+
Screenshotter: () => Screenshotter,
|
|
22
|
+
validateScreenshotOptions: () => validateScreenshotOptions
|
|
5
23
|
});
|
|
6
|
-
exports
|
|
7
|
-
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var _multimap = require("../utils/isomorphic/multimap");
|
|
11
|
-
/**
|
|
12
|
-
* Copyright 2019 Google Inc. All rights reserved.
|
|
13
|
-
* Modifications copyright (c) Microsoft Corporation.
|
|
14
|
-
*
|
|
15
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
16
|
-
* you may not use this file except in compliance with the License.
|
|
17
|
-
* You may obtain a copy of the License at
|
|
18
|
-
*
|
|
19
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
20
|
-
*
|
|
21
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
22
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
23
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
24
|
-
* See the License for the specific language governing permissions and
|
|
25
|
-
* limitations under the License.
|
|
26
|
-
*/
|
|
27
|
-
|
|
24
|
+
module.exports = __toCommonJS(screenshotter_exports);
|
|
25
|
+
var import_helper = require("./helper");
|
|
26
|
+
var import_utils = require("../utils");
|
|
27
|
+
var import_multimap = require("../utils/isomorphic/multimap");
|
|
28
28
|
function inPagePrepareForScreenshots(screenshotStyle, hideCaret, disableAnimations, syncAnimations) {
|
|
29
|
-
// In WebKit, sync the animations.
|
|
30
29
|
if (syncAnimations) {
|
|
31
|
-
const style = document.createElement(
|
|
32
|
-
style.textContent =
|
|
30
|
+
const style = document.createElement("style");
|
|
31
|
+
style.textContent = "body {}";
|
|
33
32
|
document.head.appendChild(style);
|
|
34
33
|
document.documentElement.getBoundingClientRect();
|
|
35
34
|
style.remove();
|
|
36
35
|
}
|
|
37
|
-
if (!screenshotStyle && !hideCaret && !disableAnimations)
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
if (!screenshotStyle && !hideCaret && !disableAnimations)
|
|
37
|
+
return;
|
|
38
|
+
const collectRoots = (root, roots2 = []) => {
|
|
39
|
+
roots2.push(root);
|
|
40
40
|
const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);
|
|
41
41
|
do {
|
|
42
42
|
const node = walker.currentNode;
|
|
43
43
|
const shadowRoot = node instanceof Element ? node.shadowRoot : null;
|
|
44
|
-
if (shadowRoot)
|
|
44
|
+
if (shadowRoot)
|
|
45
|
+
collectRoots(shadowRoot, roots2);
|
|
45
46
|
} while (walker.nextNode());
|
|
46
|
-
return
|
|
47
|
+
return roots2;
|
|
47
48
|
};
|
|
48
49
|
const roots = collectRoots(document);
|
|
49
50
|
const cleanupCallbacks = [];
|
|
50
51
|
if (screenshotStyle) {
|
|
51
52
|
for (const root of roots) {
|
|
52
|
-
const styleTag = document.createElement(
|
|
53
|
+
const styleTag = document.createElement("style");
|
|
53
54
|
styleTag.textContent = screenshotStyle;
|
|
54
|
-
if (root === document)
|
|
55
|
+
if (root === document)
|
|
56
|
+
document.documentElement.append(styleTag);
|
|
57
|
+
else
|
|
58
|
+
root.append(styleTag);
|
|
55
59
|
cleanupCallbacks.push(() => {
|
|
56
60
|
styleTag.remove();
|
|
57
61
|
});
|
|
58
62
|
}
|
|
59
63
|
}
|
|
60
64
|
if (hideCaret) {
|
|
61
|
-
const elements = new Map();
|
|
65
|
+
const elements = /* @__PURE__ */ new Map();
|
|
62
66
|
for (const root of roots) {
|
|
63
|
-
root.querySelectorAll(
|
|
67
|
+
root.querySelectorAll("input,textarea,[contenteditable]").forEach((element) => {
|
|
64
68
|
elements.set(element, {
|
|
65
|
-
value: element.style.getPropertyValue(
|
|
66
|
-
priority: element.style.getPropertyPriority(
|
|
69
|
+
value: element.style.getPropertyValue("caret-color"),
|
|
70
|
+
priority: element.style.getPropertyPriority("caret-color")
|
|
67
71
|
});
|
|
68
|
-
element.style.setProperty(
|
|
72
|
+
element.style.setProperty("caret-color", "transparent", "important");
|
|
69
73
|
});
|
|
70
74
|
}
|
|
71
75
|
cleanupCallbacks.push(() => {
|
|
72
|
-
for (const [element, value] of elements)
|
|
76
|
+
for (const [element, value] of elements)
|
|
77
|
+
element.style.setProperty("caret-color", value.value, value.priority);
|
|
73
78
|
});
|
|
74
79
|
}
|
|
75
80
|
if (disableAnimations) {
|
|
76
|
-
const infiniteAnimationsToResume = new Set();
|
|
77
|
-
const handleAnimations = root => {
|
|
81
|
+
const infiniteAnimationsToResume = /* @__PURE__ */ new Set();
|
|
82
|
+
const handleAnimations = (root) => {
|
|
78
83
|
for (const animation of root.getAnimations()) {
|
|
79
|
-
if (!animation.effect || animation.playbackRate === 0 || infiniteAnimationsToResume.has(animation))
|
|
84
|
+
if (!animation.effect || animation.playbackRate === 0 || infiniteAnimationsToResume.has(animation))
|
|
85
|
+
continue;
|
|
80
86
|
const endTime = animation.effect.getComputedTiming().endTime;
|
|
81
87
|
if (Number.isFinite(endTime)) {
|
|
82
88
|
try {
|
|
83
89
|
animation.finish();
|
|
84
90
|
} catch (e) {
|
|
85
|
-
// animation.finish() should not throw for
|
|
86
|
-
// finite animations, but we'd like to be on the
|
|
87
|
-
// safe side.
|
|
88
91
|
}
|
|
89
92
|
} else {
|
|
90
93
|
try {
|
|
91
94
|
animation.cancel();
|
|
92
95
|
infiniteAnimationsToResume.add(animation);
|
|
93
96
|
} catch (e) {
|
|
94
|
-
// animation.cancel() should not throw for
|
|
95
|
-
// infinite animations, but we'd like to be on the
|
|
96
|
-
// safe side.
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
}
|
|
@@ -101,11 +101,11 @@ function inPagePrepareForScreenshots(screenshotStyle, hideCaret, disableAnimatio
|
|
|
101
101
|
for (const root of roots) {
|
|
102
102
|
const handleRootAnimations = handleAnimations.bind(null, root);
|
|
103
103
|
handleRootAnimations();
|
|
104
|
-
root.addEventListener(
|
|
105
|
-
root.addEventListener(
|
|
104
|
+
root.addEventListener("transitionrun", handleRootAnimations);
|
|
105
|
+
root.addEventListener("animationstart", handleRootAnimations);
|
|
106
106
|
cleanupCallbacks.push(() => {
|
|
107
|
-
root.removeEventListener(
|
|
108
|
-
root.removeEventListener(
|
|
107
|
+
root.removeEventListener("transitionrun", handleRootAnimations);
|
|
108
|
+
root.removeEventListener("animationstart", handleRootAnimations);
|
|
109
109
|
});
|
|
110
110
|
}
|
|
111
111
|
cleanupCallbacks.push(() => {
|
|
@@ -113,42 +113,50 @@ function inPagePrepareForScreenshots(screenshotStyle, hideCaret, disableAnimatio
|
|
|
113
113
|
try {
|
|
114
114
|
animation.play();
|
|
115
115
|
} catch (e) {
|
|
116
|
-
// animation.play() should never throw, but
|
|
117
|
-
// we'd like to be on the safe side.
|
|
118
116
|
}
|
|
119
117
|
}
|
|
120
118
|
});
|
|
121
119
|
}
|
|
122
120
|
window.__pwCleanupScreenshot = () => {
|
|
123
|
-
for (const cleanupCallback of cleanupCallbacks)
|
|
121
|
+
for (const cleanupCallback of cleanupCallbacks)
|
|
122
|
+
cleanupCallback();
|
|
124
123
|
delete window.__pwCleanupScreenshot;
|
|
125
124
|
};
|
|
126
125
|
}
|
|
127
126
|
class Screenshotter {
|
|
128
127
|
constructor(page) {
|
|
129
128
|
this._queue = new TaskQueue();
|
|
130
|
-
this._page = void 0;
|
|
131
129
|
this._page = page;
|
|
132
130
|
this._queue = new TaskQueue();
|
|
133
131
|
}
|
|
134
132
|
async _originalViewportSize(progress) {
|
|
135
133
|
const originalViewportSize = this._page.viewportSize();
|
|
136
134
|
let viewportSize = originalViewportSize;
|
|
137
|
-
if (!viewportSize)
|
|
138
|
-
width: window.innerWidth,
|
|
139
|
-
|
|
140
|
-
}));
|
|
141
|
-
return {
|
|
142
|
-
viewportSize,
|
|
143
|
-
originalViewportSize
|
|
144
|
-
};
|
|
135
|
+
if (!viewportSize)
|
|
136
|
+
viewportSize = await this._page.mainFrame().waitForFunctionValueInUtility(progress, () => ({ width: window.innerWidth, height: window.innerHeight }));
|
|
137
|
+
return { viewportSize, originalViewportSize };
|
|
145
138
|
}
|
|
146
139
|
async _fullPageSize(progress) {
|
|
147
140
|
const fullPageSize = await this._page.mainFrame().waitForFunctionValueInUtility(progress, () => {
|
|
148
|
-
if (!document.body || !document.documentElement)
|
|
141
|
+
if (!document.body || !document.documentElement)
|
|
142
|
+
return null;
|
|
149
143
|
return {
|
|
150
|
-
width: Math.max(
|
|
151
|
-
|
|
144
|
+
width: Math.max(
|
|
145
|
+
document.body.scrollWidth,
|
|
146
|
+
document.documentElement.scrollWidth,
|
|
147
|
+
document.body.offsetWidth,
|
|
148
|
+
document.documentElement.offsetWidth,
|
|
149
|
+
document.body.clientWidth,
|
|
150
|
+
document.documentElement.clientWidth
|
|
151
|
+
),
|
|
152
|
+
height: Math.max(
|
|
153
|
+
document.body.scrollHeight,
|
|
154
|
+
document.documentElement.scrollHeight,
|
|
155
|
+
document.body.offsetHeight,
|
|
156
|
+
document.documentElement.offsetHeight,
|
|
157
|
+
document.body.clientHeight,
|
|
158
|
+
document.documentElement.clientHeight
|
|
159
|
+
)
|
|
152
160
|
};
|
|
153
161
|
});
|
|
154
162
|
return fullPageSize;
|
|
@@ -156,35 +164,24 @@ class Screenshotter {
|
|
|
156
164
|
async screenshotPage(progress, options) {
|
|
157
165
|
const format = validateScreenshotOptions(options);
|
|
158
166
|
return this._queue.postTask(async () => {
|
|
159
|
-
progress.log(
|
|
160
|
-
const {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
await this._preparePageForScreenshot(progress, this._page.mainFrame(), options.style, options.caret !== 'initial', options.animations === 'disabled');
|
|
164
|
-
progress.throwIfAborted(); // Avoid restoring after failure - should be done by cleanup.
|
|
165
|
-
|
|
167
|
+
progress.log("taking page screenshot");
|
|
168
|
+
const { viewportSize } = await this._originalViewportSize(progress);
|
|
169
|
+
await this._preparePageForScreenshot(progress, this._page.mainFrame(), options.style, options.caret !== "initial", options.animations === "disabled");
|
|
170
|
+
progress.throwIfAborted();
|
|
166
171
|
if (options.fullPage) {
|
|
167
172
|
const fullPageSize = await this._fullPageSize(progress);
|
|
168
|
-
let documentRect = {
|
|
169
|
-
x: 0,
|
|
170
|
-
y: 0,
|
|
171
|
-
width: fullPageSize.width,
|
|
172
|
-
height: fullPageSize.height
|
|
173
|
-
};
|
|
173
|
+
let documentRect = { x: 0, y: 0, width: fullPageSize.width, height: fullPageSize.height };
|
|
174
174
|
const fitsViewport = fullPageSize.width <= viewportSize.width && fullPageSize.height <= viewportSize.height;
|
|
175
|
-
if (options.clip)
|
|
176
|
-
|
|
177
|
-
|
|
175
|
+
if (options.clip)
|
|
176
|
+
documentRect = trimClipToSize(options.clip, documentRect);
|
|
177
|
+
const buffer2 = await this._screenshot(progress, format, documentRect, void 0, fitsViewport, options);
|
|
178
|
+
progress.throwIfAborted();
|
|
178
179
|
await this._restorePageAfterScreenshot();
|
|
179
|
-
return
|
|
180
|
+
return buffer2;
|
|
180
181
|
}
|
|
181
|
-
const viewportRect = options.clip ? trimClipToSize(options.clip, viewportSize) : {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
...viewportSize
|
|
185
|
-
};
|
|
186
|
-
const buffer = await this._screenshot(progress, format, undefined, viewportRect, true, options);
|
|
187
|
-
progress.throwIfAborted(); // Avoid restoring after failure - should be done by cleanup.
|
|
182
|
+
const viewportRect = options.clip ? trimClipToSize(options.clip, viewportSize) : { x: 0, y: 0, ...viewportSize };
|
|
183
|
+
const buffer = await this._screenshot(progress, format, void 0, viewportRect, true, options);
|
|
184
|
+
progress.throwIfAborted();
|
|
188
185
|
await this._restorePageAfterScreenshot();
|
|
189
186
|
return buffer;
|
|
190
187
|
});
|
|
@@ -192,114 +189,102 @@ class Screenshotter {
|
|
|
192
189
|
async screenshotElement(progress, handle, options) {
|
|
193
190
|
const format = validateScreenshotOptions(options);
|
|
194
191
|
return this._queue.postTask(async () => {
|
|
195
|
-
progress.log(
|
|
196
|
-
const {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
await
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
192
|
+
progress.log("taking element screenshot");
|
|
193
|
+
const { viewportSize } = await this._originalViewportSize(progress);
|
|
194
|
+
await this._preparePageForScreenshot(progress, handle._frame, options.style, options.caret !== "initial", options.animations === "disabled");
|
|
195
|
+
progress.throwIfAborted();
|
|
196
|
+
await handle._waitAndScrollIntoViewIfNeeded(
|
|
197
|
+
progress,
|
|
198
|
+
true
|
|
199
|
+
/* waitForVisible */
|
|
200
|
+
);
|
|
201
|
+
progress.throwIfAborted();
|
|
204
202
|
const boundingBox = await handle.boundingBox();
|
|
205
|
-
(0,
|
|
206
|
-
(0,
|
|
207
|
-
(0,
|
|
203
|
+
(0, import_utils.assert)(boundingBox, "Node is either not visible or not an HTMLElement");
|
|
204
|
+
(0, import_utils.assert)(boundingBox.width !== 0, "Node has 0 width.");
|
|
205
|
+
(0, import_utils.assert)(boundingBox.height !== 0, "Node has 0 height.");
|
|
208
206
|
const fitsViewport = boundingBox.width <= viewportSize.width && boundingBox.height <= viewportSize.height;
|
|
209
|
-
progress.throwIfAborted();
|
|
210
|
-
const scrollOffset = await this._page.mainFrame().waitForFunctionValueInUtility(progress, () => ({
|
|
211
|
-
|
|
212
|
-
y: window.scrollY
|
|
213
|
-
}));
|
|
214
|
-
const documentRect = {
|
|
215
|
-
...boundingBox
|
|
216
|
-
};
|
|
207
|
+
progress.throwIfAborted();
|
|
208
|
+
const scrollOffset = await this._page.mainFrame().waitForFunctionValueInUtility(progress, () => ({ x: window.scrollX, y: window.scrollY }));
|
|
209
|
+
const documentRect = { ...boundingBox };
|
|
217
210
|
documentRect.x += scrollOffset.x;
|
|
218
211
|
documentRect.y += scrollOffset.y;
|
|
219
|
-
const buffer = await this._screenshot(progress, format,
|
|
220
|
-
progress.throwIfAborted();
|
|
212
|
+
const buffer = await this._screenshot(progress, format, import_helper.helper.enclosingIntRect(documentRect), void 0, fitsViewport, options);
|
|
213
|
+
progress.throwIfAborted();
|
|
221
214
|
await this._restorePageAfterScreenshot();
|
|
222
215
|
return buffer;
|
|
223
216
|
});
|
|
224
217
|
}
|
|
225
218
|
async _preparePageForScreenshot(progress, frame, screenshotStyle, hideCaret, disableAnimations) {
|
|
226
|
-
if (disableAnimations)
|
|
219
|
+
if (disableAnimations)
|
|
220
|
+
progress.log(" disabled all CSS animations");
|
|
227
221
|
const syncAnimations = this._page._delegate.shouldToggleStyleSheetToSyncAnimations();
|
|
228
|
-
await this._page.safeNonStallingEvaluateInAllFrames(
|
|
222
|
+
await this._page.safeNonStallingEvaluateInAllFrames("(" + inPagePrepareForScreenshots.toString() + `)(${JSON.stringify(screenshotStyle)}, ${hideCaret}, ${disableAnimations}, ${syncAnimations})`, "utility");
|
|
229
223
|
if (!process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY) {
|
|
230
|
-
progress.log(
|
|
231
|
-
await frame.nonStallingEvaluateInExistingContext(
|
|
232
|
-
|
|
224
|
+
progress.log("waiting for fonts to load...");
|
|
225
|
+
await frame.nonStallingEvaluateInExistingContext("document.fonts.ready", "utility").catch(() => {
|
|
226
|
+
});
|
|
227
|
+
progress.log("fonts loaded");
|
|
233
228
|
}
|
|
234
229
|
progress.cleanupWhenAborted(() => this._restorePageAfterScreenshot());
|
|
235
230
|
}
|
|
236
231
|
async _restorePageAfterScreenshot() {
|
|
237
|
-
await this._page.safeNonStallingEvaluateInAllFrames(
|
|
232
|
+
await this._page.safeNonStallingEvaluateInAllFrames("window.__pwCleanupScreenshot && window.__pwCleanupScreenshot()", "utility");
|
|
238
233
|
}
|
|
239
234
|
async _maskElements(progress, options) {
|
|
240
|
-
const framesToParsedSelectors = new
|
|
235
|
+
const framesToParsedSelectors = new import_multimap.MultiMap();
|
|
241
236
|
const cleanup = async () => {
|
|
242
|
-
await Promise.all([...framesToParsedSelectors.keys()].map(async frame => {
|
|
237
|
+
await Promise.all([...framesToParsedSelectors.keys()].map(async (frame) => {
|
|
243
238
|
await frame.hideHighlight();
|
|
244
239
|
}));
|
|
245
240
|
};
|
|
246
|
-
if (!options.mask || !options.mask.length)
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
selector
|
|
250
|
-
}) => {
|
|
241
|
+
if (!options.mask || !options.mask.length)
|
|
242
|
+
return cleanup;
|
|
243
|
+
await Promise.all((options.mask || []).map(async ({ frame, selector }) => {
|
|
251
244
|
const pair = await frame.selectors.resolveFrameForSelector(selector);
|
|
252
|
-
if (pair)
|
|
245
|
+
if (pair)
|
|
246
|
+
framesToParsedSelectors.set(pair.frame, pair.info.parsed);
|
|
253
247
|
}));
|
|
254
|
-
progress.throwIfAborted();
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
await frame.maskSelectors(framesToParsedSelectors.get(frame), options.maskColor || '#F0F');
|
|
248
|
+
progress.throwIfAborted();
|
|
249
|
+
await Promise.all([...framesToParsedSelectors.keys()].map(async (frame) => {
|
|
250
|
+
await frame.maskSelectors(framesToParsedSelectors.get(frame), options.maskColor || "#F0F");
|
|
258
251
|
}));
|
|
259
252
|
progress.cleanupWhenAborted(cleanup);
|
|
260
253
|
return cleanup;
|
|
261
254
|
}
|
|
262
255
|
async _screenshot(progress, format, documentRect, viewportRect, fitsViewport, options) {
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
progress.throwIfAborted();
|
|
266
|
-
const shouldSetDefaultBackground = options.omitBackground && format ===
|
|
256
|
+
if (options.__testHookBeforeScreenshot)
|
|
257
|
+
await options.__testHookBeforeScreenshot();
|
|
258
|
+
progress.throwIfAborted();
|
|
259
|
+
const shouldSetDefaultBackground = options.omitBackground && format === "png";
|
|
267
260
|
if (shouldSetDefaultBackground) {
|
|
268
|
-
await this._page._delegate.setBackgroundColor({
|
|
269
|
-
r: 0,
|
|
270
|
-
g: 0,
|
|
271
|
-
b: 0,
|
|
272
|
-
a: 0
|
|
273
|
-
});
|
|
261
|
+
await this._page._delegate.setBackgroundColor({ r: 0, g: 0, b: 0, a: 0 });
|
|
274
262
|
progress.cleanupWhenAborted(() => this._page._delegate.setBackgroundColor());
|
|
275
263
|
}
|
|
276
|
-
progress.throwIfAborted();
|
|
277
|
-
|
|
264
|
+
progress.throwIfAborted();
|
|
278
265
|
const cleanupHighlight = await this._maskElements(progress, options);
|
|
279
|
-
progress.throwIfAborted();
|
|
280
|
-
|
|
281
|
-
const
|
|
282
|
-
|
|
283
|
-
progress.throwIfAborted(); // Avoid restoring after failure - should be done by cleanup.
|
|
284
|
-
|
|
266
|
+
progress.throwIfAborted();
|
|
267
|
+
const quality = format === "jpeg" ? options.quality ?? 80 : void 0;
|
|
268
|
+
const buffer = await this._page._delegate.takeScreenshot(progress, format, documentRect, viewportRect, quality, fitsViewport, options.scale || "device");
|
|
269
|
+
progress.throwIfAborted();
|
|
285
270
|
await cleanupHighlight();
|
|
286
|
-
progress.throwIfAborted();
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
progress.throwIfAborted();
|
|
290
|
-
if (options.__testHookAfterScreenshot)
|
|
271
|
+
progress.throwIfAborted();
|
|
272
|
+
if (shouldSetDefaultBackground)
|
|
273
|
+
await this._page._delegate.setBackgroundColor();
|
|
274
|
+
progress.throwIfAborted();
|
|
275
|
+
if (options.__testHookAfterScreenshot)
|
|
276
|
+
await options.__testHookAfterScreenshot();
|
|
291
277
|
return buffer;
|
|
292
278
|
}
|
|
293
279
|
}
|
|
294
|
-
exports.Screenshotter = Screenshotter;
|
|
295
280
|
class TaskQueue {
|
|
296
281
|
constructor() {
|
|
297
|
-
this._chain = void 0;
|
|
298
282
|
this._chain = Promise.resolve();
|
|
299
283
|
}
|
|
300
284
|
postTask(task) {
|
|
301
285
|
const result = this._chain.then(task);
|
|
302
|
-
this._chain = result.catch(() => {
|
|
286
|
+
this._chain = result.catch(() => {
|
|
287
|
+
});
|
|
303
288
|
return result;
|
|
304
289
|
}
|
|
305
290
|
}
|
|
@@ -312,37 +297,36 @@ function trimClipToSize(clip, size) {
|
|
|
312
297
|
x: Math.max(0, Math.min(clip.x + clip.width, size.width)),
|
|
313
298
|
y: Math.max(0, Math.min(clip.y + clip.height, size.height))
|
|
314
299
|
};
|
|
315
|
-
const result = {
|
|
316
|
-
|
|
317
|
-
y: p1.y,
|
|
318
|
-
width: p2.x - p1.x,
|
|
319
|
-
height: p2.y - p1.y
|
|
320
|
-
};
|
|
321
|
-
(0, _utils.assert)(result.width && result.height, 'Clipped area is either empty or outside the resulting image');
|
|
300
|
+
const result = { x: p1.x, y: p1.y, width: p2.x - p1.x, height: p2.y - p1.y };
|
|
301
|
+
(0, import_utils.assert)(result.width && result.height, "Clipped area is either empty or outside the resulting image");
|
|
322
302
|
return result;
|
|
323
303
|
}
|
|
324
304
|
function validateScreenshotOptions(options) {
|
|
325
305
|
let format = null;
|
|
326
|
-
// options.type takes precedence over inferring the type from options.path
|
|
327
|
-
// because it may be a 0-length file with no extension created beforehand (i.e. as a temp file).
|
|
328
306
|
if (options.type) {
|
|
329
|
-
(0,
|
|
307
|
+
(0, import_utils.assert)(options.type === "png" || options.type === "jpeg", "Unknown options.type value: " + options.type);
|
|
330
308
|
format = options.type;
|
|
331
309
|
}
|
|
332
|
-
if (!format)
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
(0,
|
|
336
|
-
(0,
|
|
337
|
-
(0,
|
|
310
|
+
if (!format)
|
|
311
|
+
format = "png";
|
|
312
|
+
if (options.quality !== void 0) {
|
|
313
|
+
(0, import_utils.assert)(format === "jpeg", "options.quality is unsupported for the " + format + " screenshots");
|
|
314
|
+
(0, import_utils.assert)(typeof options.quality === "number", "Expected options.quality to be a number but found " + typeof options.quality);
|
|
315
|
+
(0, import_utils.assert)(Number.isInteger(options.quality), "Expected options.quality to be an integer");
|
|
316
|
+
(0, import_utils.assert)(options.quality >= 0 && options.quality <= 100, "Expected options.quality to be between 0 and 100 (inclusive), got " + options.quality);
|
|
338
317
|
}
|
|
339
318
|
if (options.clip) {
|
|
340
|
-
(0,
|
|
341
|
-
(0,
|
|
342
|
-
(0,
|
|
343
|
-
(0,
|
|
344
|
-
(0,
|
|
345
|
-
(0,
|
|
319
|
+
(0, import_utils.assert)(typeof options.clip.x === "number", "Expected options.clip.x to be a number but found " + typeof options.clip.x);
|
|
320
|
+
(0, import_utils.assert)(typeof options.clip.y === "number", "Expected options.clip.y to be a number but found " + typeof options.clip.y);
|
|
321
|
+
(0, import_utils.assert)(typeof options.clip.width === "number", "Expected options.clip.width to be a number but found " + typeof options.clip.width);
|
|
322
|
+
(0, import_utils.assert)(typeof options.clip.height === "number", "Expected options.clip.height to be a number but found " + typeof options.clip.height);
|
|
323
|
+
(0, import_utils.assert)(options.clip.width !== 0, "Expected options.clip.width not to be 0.");
|
|
324
|
+
(0, import_utils.assert)(options.clip.height !== 0, "Expected options.clip.height not to be 0.");
|
|
346
325
|
}
|
|
347
326
|
return format;
|
|
348
|
-
}
|
|
327
|
+
}
|
|
328
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
329
|
+
0 && (module.exports = {
|
|
330
|
+
Screenshotter,
|
|
331
|
+
validateScreenshotOptions
|
|
332
|
+
});
|