rebrowser-playwright-core 1.49.1 → 1.64.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.
- package/ThirdPartyNotices.txt +7 -1228
- package/bin/install_webkit_wsl.ps1 +33 -0
- package/bin/reinstall_chrome_beta_linux.sh +1 -1
- package/bin/reinstall_chrome_beta_mac.sh +1 -1
- package/bin/reinstall_chrome_stable_linux.sh +1 -1
- package/bin/reinstall_chrome_stable_mac.sh +1 -1
- package/bin/reinstall_msedge_beta_linux.sh +7 -1
- package/bin/reinstall_msedge_beta_mac.sh +1 -1
- package/bin/reinstall_msedge_dev_linux.sh +7 -1
- package/bin/reinstall_msedge_dev_mac.sh +1 -1
- package/bin/reinstall_msedge_stable_linux.sh +7 -1
- package/bin/reinstall_msedge_stable_mac.sh +1 -1
- package/browsers.json +21 -34
- package/cli.js +5 -1
- package/index.js +2 -18
- package/lib/bootstrap.js +149 -0
- package/lib/coreBundle.js +78218 -0
- package/lib/entry/cliDaemon.js +5 -0
- package/lib/entry/dashboardApp.js +3 -0
- package/lib/entry/mcp.js +10 -0
- package/lib/entry/oopBrowserDownload.js +3 -0
- package/lib/package.js +50 -0
- package/lib/server/electron/loader.js +109 -43
- package/lib/serverRegistry.js +1939 -0
- package/lib/serverRegistry.js.LICENSE +65 -0
- package/lib/tools/cli-client/channelSessions.js +141 -0
- package/lib/tools/cli-client/cli.js +7 -0
- package/lib/tools/cli-client/help.json +808 -0
- package/lib/tools/cli-client/minimist.js +128 -0
- package/lib/tools/cli-client/output.js +352 -0
- package/lib/tools/cli-client/program.js +422 -0
- package/lib/tools/cli-client/registry.js +180 -0
- package/lib/tools/cli-client/session.js +261 -0
- package/lib/tools/dashboard/appIcon.png +0 -0
- package/lib/tools/skills/playwright-cli/SKILL.md +493 -0
- package/lib/tools/skills/playwright-cli/references/element-attributes.md +23 -0
- package/lib/tools/skills/playwright-cli/references/playwright-tests.md +39 -0
- package/lib/tools/skills/playwright-cli/references/pr-attachments.md +60 -0
- package/lib/tools/skills/playwright-cli/references/request-mocking.md +87 -0
- package/lib/tools/skills/playwright-cli/references/running-code.md +245 -0
- package/lib/tools/skills/playwright-cli/references/session-management.md +227 -0
- package/lib/tools/skills/playwright-cli/references/storage-state.md +275 -0
- package/lib/tools/skills/playwright-cli/references/test-generation.md +433 -0
- package/lib/tools/skills/playwright-cli/references/tracing.md +139 -0
- package/lib/tools/skills/playwright-cli/references/video-recording.md +216 -0
- package/lib/tools/skills/playwright-component-testing/SKILL.md +136 -0
- package/lib/tools/skills/playwright-component-testing/references/gallery-spec.md +144 -0
- package/lib/tools/skills/playwright-component-testing/references/migration.md +89 -0
- package/lib/tools/skills/playwright-component-testing/references/react.md +69 -0
- package/lib/tools/skills/playwright-component-testing/references/typing.md +173 -0
- package/lib/tools/skills/playwright-component-testing/references/vue.md +77 -0
- package/lib/tools/skills/playwright-trace/SKILL.md +174 -0
- package/lib/tools/utils/extension.js +112 -0
- package/lib/tools/utils/socketConnection.js +108 -0
- package/lib/utilsBundle.js +86076 -79
- package/lib/utilsBundle.js.LICENSE +1890 -0
- package/lib/vite/dashboard/assets/codeMirrorModule--QdMvsKi.css +1 -0
- package/lib/vite/dashboard/assets/codeMirrorModule-CQ8RZGBm.js +32 -0
- package/lib/vite/dashboard/assets/codicon-DCmgc-ay.ttf +0 -0
- package/lib/vite/dashboard/assets/firefox-1bWoP6pv.svg +1 -0
- package/lib/vite/dashboard/assets/firefox-beta-k3eOH_eK.svg +1 -0
- package/lib/vite/dashboard/assets/firefox-nightly-Cp5nfeDT.svg +1 -0
- package/lib/vite/dashboard/assets/index-AwgwcYie.css +1 -0
- package/lib/vite/dashboard/assets/index-hRvO4yU2.js +12 -0
- package/lib/vite/dashboard/assets/safari-na3_-uQk.svg +1 -0
- package/lib/vite/dashboard/index.html +29 -0
- package/lib/vite/dashboard/playwright-logo.svg +24 -0
- package/lib/vite/htmlReport/index.html +3 -56
- package/lib/vite/htmlReport/report.css +2 -0
- package/lib/vite/htmlReport/report.js +32 -0
- package/lib/vite/recorder/assets/codeMirrorModule--QdMvsKi.css +1 -0
- package/lib/vite/recorder/assets/codeMirrorModule-DK72OMRi.js +32 -0
- package/lib/vite/recorder/assets/index-BZpYJZ-P.css +1 -0
- package/lib/vite/recorder/assets/index-Cn0mmDuv.js +129 -0
- package/lib/vite/recorder/index.html +3 -3
- package/lib/vite/traceViewer/assets/codeMirrorModule-BEB2e8M3.js +32 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-D-g2vrvf.js +184 -0
- package/lib/vite/traceViewer/assets/urlMatch-L3liM589.js +1 -0
- package/lib/vite/traceViewer/assets/xtermModule-B794rD2Z.js +7 -0
- package/lib/vite/traceViewer/codeMirrorModule.-QdMvsKi.css +1 -0
- package/lib/vite/traceViewer/defaultSettingsView.C8BeHuxd.css +1 -0
- package/lib/vite/traceViewer/index.B_TqY17P.css +1 -0
- package/lib/vite/traceViewer/index.html +9 -11
- package/lib/vite/traceViewer/index.oNry3Hjv.js +1 -0
- package/lib/vite/traceViewer/manifest.webmanifest +16 -0
- package/lib/vite/traceViewer/snapshot.B_Jk1wbt.js +1 -0
- package/lib/vite/traceViewer/snapshot.html +4 -15
- package/lib/vite/traceViewer/sw.bundle.js +4 -3
- package/lib/vite/traceViewer/uiMode.CYwC_gH1.js +5 -0
- package/lib/vite/traceViewer/uiMode.CyMfwkXJ.css +1 -0
- package/lib/vite/traceViewer/uiMode.html +6 -8
- package/lib/vite/traceViewer/xtermModule.kHJ-D0s7.css +1 -0
- package/lib/webp_codec.LICENSE +173 -0
- package/lib/webp_codec.wasm +0 -0
- package/lib/{utilsBundleImpl/xdg-open → xdg-open} +338 -137
- package/package.json +6 -16
- package/types/protocol.d.ts +9357 -6200
- package/types/structs.d.ts +8 -1
- package/types/types.d.ts +9490 -4947
- package/bin/PrintDeps.exe +0 -0
- package/bin/README.md +0 -2
- package/lib/androidServerImpl.js +0 -69
- package/lib/browserServerImpl.js +0 -92
- package/lib/cli/driver.js +0 -95
- package/lib/cli/program.js +0 -607
- package/lib/cli/programWithTestStub.js +0 -67
- package/lib/client/accessibility.js +0 -50
- package/lib/client/android.js +0 -473
- package/lib/client/api.js +0 -285
- package/lib/client/artifact.js +0 -79
- package/lib/client/browser.js +0 -145
- package/lib/client/browserContext.js +0 -559
- package/lib/client/browserType.js +0 -241
- package/lib/client/cdpSession.js +0 -53
- package/lib/client/channelOwner.js +0 -235
- package/lib/client/clientHelper.js +0 -57
- package/lib/client/clientInstrumentation.js +0 -50
- package/lib/client/clock.js +0 -68
- package/lib/client/connection.js +0 -333
- package/lib/client/consoleMessage.js +0 -55
- package/lib/client/coverage.js +0 -41
- package/lib/client/dialog.js +0 -57
- package/lib/client/download.js +0 -62
- package/lib/client/electron.js +0 -135
- package/lib/client/elementHandle.js +0 -321
- package/lib/client/errors.js +0 -77
- package/lib/client/eventEmitter.js +0 -314
- package/lib/client/events.js +0 -94
- package/lib/client/fetch.js +0 -391
- package/lib/client/fileChooser.js +0 -45
- package/lib/client/frame.js +0 -504
- package/lib/client/harRouter.js +0 -99
- package/lib/client/input.js +0 -111
- package/lib/client/jsHandle.js +0 -121
- package/lib/client/jsonPipe.js +0 -35
- package/lib/client/localUtils.js +0 -36
- package/lib/client/locator.js +0 -448
- package/lib/client/network.js +0 -767
- package/lib/client/page.js +0 -748
- package/lib/client/playwright.js +0 -80
- package/lib/client/selectors.js +0 -67
- package/lib/client/stream.js +0 -54
- package/lib/client/tracing.js +0 -147
- package/lib/client/types.js +0 -24
- package/lib/client/video.js +0 -51
- package/lib/client/waiter.js +0 -162
- package/lib/client/webError.js +0 -37
- package/lib/client/worker.js +0 -71
- package/lib/client/writableStream.js +0 -54
- package/lib/common/socksProxy.js +0 -569
- package/lib/common/timeoutSettings.js +0 -73
- package/lib/common/types.js +0 -5
- package/lib/generated/clockSource.js +0 -7
- package/lib/generated/consoleApiSource.js +0 -7
- package/lib/generated/injectedScriptSource.js +0 -7
- package/lib/generated/pollingRecorderSource.js +0 -7
- package/lib/generated/utilityScriptSource.js +0 -7
- package/lib/generated/webSocketMockSource.js +0 -7
- package/lib/image_tools/colorUtils.js +0 -98
- package/lib/image_tools/compare.js +0 -108
- package/lib/image_tools/imageChannel.js +0 -70
- package/lib/image_tools/stats.js +0 -102
- package/lib/inProcessFactory.js +0 -54
- package/lib/inprocess.js +0 -20
- package/lib/outofprocess.js +0 -67
- package/lib/protocol/debug.js +0 -27
- package/lib/protocol/serializers.js +0 -173
- package/lib/protocol/transport.js +0 -82
- package/lib/protocol/validator.js +0 -2780
- package/lib/protocol/validatorPrimitives.js +0 -139
- package/lib/remote/playwrightConnection.js +0 -274
- package/lib/remote/playwrightServer.js +0 -110
- package/lib/server/accessibility.js +0 -62
- package/lib/server/android/android.js +0 -441
- package/lib/server/android/backendAdb.js +0 -172
- package/lib/server/ariaSnapshot.js +0 -33
- package/lib/server/artifact.js +0 -104
- package/lib/server/bidi/bidiBrowser.js +0 -311
- package/lib/server/bidi/bidiChromium.js +0 -124
- package/lib/server/bidi/bidiConnection.js +0 -204
- package/lib/server/bidi/bidiExecutionContext.js +0 -156
- package/lib/server/bidi/bidiFirefox.js +0 -104
- package/lib/server/bidi/bidiInput.js +0 -158
- package/lib/server/bidi/bidiNetworkManager.js +0 -338
- package/lib/server/bidi/bidiOverCdp.js +0 -103
- package/lib/server/bidi/bidiPage.js +0 -529
- package/lib/server/bidi/bidiPdf.js +0 -140
- package/lib/server/bidi/third_party/bidiDeserializer.js +0 -93
- package/lib/server/bidi/third_party/bidiKeyboard.js +0 -238
- package/lib/server/bidi/third_party/bidiProtocol.js +0 -139
- package/lib/server/bidi/third_party/bidiSerializer.js +0 -144
- package/lib/server/bidi/third_party/firefoxPrefs.js +0 -221
- package/lib/server/browser.js +0 -148
- package/lib/server/browserContext.js +0 -667
- package/lib/server/browserType.js +0 -338
- package/lib/server/chromium/chromium.js +0 -354
- package/lib/server/chromium/chromiumSwitches.js +0 -46
- package/lib/server/chromium/crAccessibility.js +0 -237
- package/lib/server/chromium/crBrowser.js +0 -516
- package/lib/server/chromium/crConnection.js +0 -381
- package/lib/server/chromium/crCoverage.js +0 -246
- package/lib/server/chromium/crDevTools.js +0 -108
- package/lib/server/chromium/crDragDrop.js +0 -143
- package/lib/server/chromium/crExecutionContext.js +0 -136
- package/lib/server/chromium/crInput.js +0 -171
- package/lib/server/chromium/crNetworkManager.js +0 -767
- package/lib/server/chromium/crPage.js +0 -1143
- package/lib/server/chromium/crPdf.js +0 -153
- package/lib/server/chromium/crProtocolHelper.js +0 -133
- package/lib/server/chromium/crServiceWorker.js +0 -114
- package/lib/server/chromium/defaultFontFamilies.js +0 -145
- package/lib/server/chromium/videoRecorder.js +0 -155
- package/lib/server/clock.js +0 -125
- package/lib/server/codegen/csharp.js +0 -294
- package/lib/server/codegen/java.js +0 -232
- package/lib/server/codegen/javascript.js +0 -245
- package/lib/server/codegen/jsonl.js +0 -47
- package/lib/server/codegen/language.js +0 -88
- package/lib/server/codegen/languages.js +0 -30
- package/lib/server/codegen/python.js +0 -261
- package/lib/server/codegen/types.js +0 -5
- package/lib/server/console.js +0 -57
- package/lib/server/cookieStore.js +0 -185
- package/lib/server/debugController.js +0 -237
- package/lib/server/debugger.js +0 -132
- package/lib/server/deviceDescriptors.js +0 -26
- package/lib/server/deviceDescriptorsSource.json +0 -1669
- package/lib/server/dialog.js +0 -71
- package/lib/server/dispatchers/androidDispatcher.js +0 -204
- package/lib/server/dispatchers/artifactDispatcher.js +0 -118
- package/lib/server/dispatchers/browserContextDispatcher.js +0 -368
- package/lib/server/dispatchers/browserDispatcher.js +0 -170
- package/lib/server/dispatchers/browserTypeDispatcher.js +0 -55
- package/lib/server/dispatchers/cdpSessionDispatcher.js +0 -48
- package/lib/server/dispatchers/debugControllerDispatcher.js +0 -103
- package/lib/server/dispatchers/dialogDispatcher.js +0 -44
- package/lib/server/dispatchers/dispatcher.js +0 -395
- package/lib/server/dispatchers/electronDispatcher.js +0 -93
- package/lib/server/dispatchers/elementHandlerDispatcher.js +0 -228
- package/lib/server/dispatchers/frameDispatcher.js +0 -293
- package/lib/server/dispatchers/jsHandleDispatcher.js +0 -97
- package/lib/server/dispatchers/jsonPipeDispatcher.js +0 -59
- package/lib/server/dispatchers/localUtilsDispatcher.js +0 -413
- package/lib/server/dispatchers/networkDispatchers.js +0 -221
- package/lib/server/dispatchers/pageDispatcher.js +0 -367
- package/lib/server/dispatchers/playwrightDispatcher.js +0 -107
- package/lib/server/dispatchers/selectorsDispatcher.js +0 -36
- package/lib/server/dispatchers/streamDispatcher.js +0 -62
- package/lib/server/dispatchers/tracingDispatcher.js +0 -64
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +0 -189
- package/lib/server/dispatchers/writableStreamDispatcher.js +0 -58
- package/lib/server/dom.js +0 -888
- package/lib/server/download.js +0 -60
- package/lib/server/electron/electron.js +0 -296
- package/lib/server/errors.js +0 -68
- package/lib/server/fetch.js +0 -669
- package/lib/server/fileChooser.js +0 -42
- package/lib/server/fileUploadUtils.js +0 -75
- package/lib/server/firefox/ffAccessibility.js +0 -216
- package/lib/server/firefox/ffBrowser.js +0 -460
- package/lib/server/firefox/ffConnection.js +0 -168
- package/lib/server/firefox/ffExecutionContext.js +0 -123
- package/lib/server/firefox/ffInput.js +0 -150
- package/lib/server/firefox/ffNetworkManager.js +0 -233
- package/lib/server/firefox/ffPage.js +0 -559
- package/lib/server/firefox/firefox.js +0 -99
- package/lib/server/formData.js +0 -75
- package/lib/server/frameSelectors.js +0 -171
- package/lib/server/frames.js +0 -1691
- package/lib/server/har/harRecorder.js +0 -139
- package/lib/server/har/harTracer.js +0 -542
- package/lib/server/helper.js +0 -103
- package/lib/server/index.js +0 -108
- package/lib/server/input.js +0 -310
- package/lib/server/instrumentation.js +0 -70
- package/lib/server/isomorphic/utilityScriptSerializers.js +0 -226
- package/lib/server/javascript.js +0 -293
- package/lib/server/launchApp.js +0 -91
- package/lib/server/macEditingCommands.js +0 -139
- package/lib/server/network.js +0 -617
- package/lib/server/page.js +0 -873
- package/lib/server/pipeTransport.js +0 -85
- package/lib/server/playwright.js +0 -88
- package/lib/server/progress.js +0 -99
- package/lib/server/protocolError.js +0 -49
- package/lib/server/recorder/contextRecorder.js +0 -299
- package/lib/server/recorder/recorderApp.js +0 -187
- package/lib/server/recorder/recorderCollection.js +0 -116
- package/lib/server/recorder/recorderFrontend.js +0 -5
- package/lib/server/recorder/recorderInTraceViewer.js +0 -144
- package/lib/server/recorder/recorderRunner.js +0 -155
- package/lib/server/recorder/recorderUtils.js +0 -113
- package/lib/server/recorder/throttledFile.js +0 -46
- package/lib/server/recorder.js +0 -364
- package/lib/server/registry/browserFetcher.js +0 -168
- package/lib/server/registry/dependencies.js +0 -322
- package/lib/server/registry/index.js +0 -1052
- package/lib/server/registry/nativeDeps.js +0 -493
- package/lib/server/registry/oopDownloadBrowserMain.js +0 -138
- package/lib/server/screenshotter.js +0 -348
- package/lib/server/selectors.js +0 -73
- package/lib/server/socksClientCertificatesInterceptor.js +0 -340
- package/lib/server/socksInterceptor.js +0 -100
- package/lib/server/trace/recorder/snapshotter.js +0 -161
- package/lib/server/trace/recorder/snapshotterInjected.js +0 -511
- package/lib/server/trace/recorder/tracing.js +0 -596
- package/lib/server/trace/test/inMemorySnapshotter.js +0 -93
- package/lib/server/trace/viewer/traceViewer.js +0 -214
- package/lib/server/transport.js +0 -191
- package/lib/server/types.js +0 -24
- package/lib/server/usKeyboardLayout.js +0 -555
- package/lib/server/webkit/webkit.js +0 -87
- package/lib/server/webkit/wkAccessibility.js +0 -194
- package/lib/server/webkit/wkBrowser.js +0 -329
- package/lib/server/webkit/wkConnection.js +0 -173
- package/lib/server/webkit/wkExecutionContext.js +0 -130
- package/lib/server/webkit/wkInput.js +0 -169
- package/lib/server/webkit/wkInterceptableRequest.js +0 -162
- package/lib/server/webkit/wkPage.js +0 -1225
- package/lib/server/webkit/wkProvisionalPage.js +0 -94
- package/lib/server/webkit/wkWorkers.js +0 -104
- package/lib/third_party/pixelmatch.js +0 -255
- package/lib/utils/ascii.js +0 -31
- package/lib/utils/comparators.js +0 -153
- package/lib/utils/crypto.js +0 -171
- package/lib/utils/debug.js +0 -46
- package/lib/utils/debugLogger.js +0 -91
- package/lib/utils/env.js +0 -49
- package/lib/utils/eventsHelper.js +0 -38
- package/lib/utils/expectUtils.js +0 -33
- package/lib/utils/fileUtils.js +0 -205
- package/lib/utils/happy-eyeballs.js +0 -194
- package/lib/utils/headers.js +0 -52
- package/lib/utils/hostPlatform.js +0 -139
- package/lib/utils/httpServer.js +0 -237
- package/lib/utils/index.js +0 -368
- package/lib/utils/isomorphic/ariaSnapshot.js +0 -267
- package/lib/utils/isomorphic/cssParser.js +0 -250
- package/lib/utils/isomorphic/cssTokenizer.js +0 -979
- package/lib/utils/isomorphic/locatorGenerators.js +0 -660
- package/lib/utils/isomorphic/locatorParser.js +0 -179
- package/lib/utils/isomorphic/locatorUtils.js +0 -62
- package/lib/utils/isomorphic/mimeType.js +0 -29
- package/lib/utils/isomorphic/recorderUtils.js +0 -227
- package/lib/utils/isomorphic/selectorParser.js +0 -397
- package/lib/utils/isomorphic/stringUtils.js +0 -169
- package/lib/utils/isomorphic/traceUtils.js +0 -39
- package/lib/utils/isomorphic/urlMatch.js +0 -124
- package/lib/utils/linuxUtils.js +0 -78
- package/lib/utils/manualPromise.js +0 -109
- package/lib/utils/multimap.js +0 -75
- package/lib/utils/network.js +0 -160
- package/lib/utils/processLauncher.js +0 -248
- package/lib/utils/profiler.js +0 -53
- package/lib/utils/rtti.js +0 -44
- package/lib/utils/semaphore.js +0 -51
- package/lib/utils/sequence.js +0 -64
- package/lib/utils/spawnAsync.js +0 -45
- package/lib/utils/stackTrace.js +0 -134
- package/lib/utils/task.js +0 -58
- package/lib/utils/time.js +0 -37
- package/lib/utils/timeoutRunner.js +0 -66
- package/lib/utils/traceUtils.js +0 -44
- package/lib/utils/userAgent.js +0 -105
- package/lib/utils/wsServer.js +0 -127
- package/lib/utils/zipFile.js +0 -75
- package/lib/utils/zones.js +0 -71
- package/lib/utilsBundleImpl/index.js +0 -210
- package/lib/vite/recorder/assets/codeMirrorModule-C5j27SYZ.js +0 -24
- package/lib/vite/recorder/assets/codeMirrorModule-ez37Vkbh.css +0 -1
- package/lib/vite/recorder/assets/index-iA1aAGZg.css +0 -1
- package/lib/vite/recorder/assets/index-m0XdVJHe.js +0 -184
- package/lib/vite/traceViewer/assets/codeMirrorModule-BBCX0spr.js +0 -24
- package/lib/vite/traceViewer/assets/inspectorTab-B4Iw34Ow.js +0 -68
- package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +0 -1
- package/lib/vite/traceViewer/assets/workbench-DFlGYqou.js +0 -9
- package/lib/vite/traceViewer/assets/xtermModule-BeNbaIVa.js +0 -9
- package/lib/vite/traceViewer/codeMirrorModule.ez37Vkbh.css +0 -1
- package/lib/vite/traceViewer/embedded.CmarehFk.js +0 -2
- package/lib/vite/traceViewer/embedded.html +0 -18
- package/lib/vite/traceViewer/embedded.w7WN2u1R.css +0 -1
- package/lib/vite/traceViewer/index.CrbWWHbf.css +0 -1
- package/lib/vite/traceViewer/index.FBucu_gE.js +0 -2
- package/lib/vite/traceViewer/inspectorTab.DEOUW62d.css +0 -1
- package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
- package/lib/vite/traceViewer/recorder.CW_rzcEp.js +0 -2
- package/lib/vite/traceViewer/recorder.html +0 -17
- package/lib/vite/traceViewer/uiMode.CDUVjusr.js +0 -5
- package/lib/vite/traceViewer/uiMode.voC1ZiOQ.css +0 -1
- package/lib/vite/traceViewer/workbench.C-zR9ysA.css +0 -1
- package/lib/vite/traceViewer/xtermModule.DSXBckUd.css +0 -32
- package/lib/zipBundle.js +0 -25
- package/lib/zipBundleImpl.js +0 -5
|
@@ -1,381 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.kBrowserCloseMessageId = exports.ConnectionEvents = exports.CRSession = exports.CRConnection = exports.CDPSession = void 0;
|
|
7
|
-
var _utils = require("../../utils");
|
|
8
|
-
var _events = require("events");
|
|
9
|
-
var _debugLogger = require("../../utils/debugLogger");
|
|
10
|
-
var _helper = require("../helper");
|
|
11
|
-
var _protocolError = require("../protocolError");
|
|
12
|
-
/**
|
|
13
|
-
* Copyright 2017 Google Inc. All rights reserved.
|
|
14
|
-
* Modifications copyright (c) Microsoft Corporation.
|
|
15
|
-
*
|
|
16
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
17
|
-
* you may not use this file except in compliance with the License.
|
|
18
|
-
* You may obtain a copy of the License at
|
|
19
|
-
*
|
|
20
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
21
|
-
*
|
|
22
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
23
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
24
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
25
|
-
* See the License for the specific language governing permissions and
|
|
26
|
-
* limitations under the License.
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
const ConnectionEvents = exports.ConnectionEvents = {
|
|
30
|
-
Disconnected: Symbol('ConnectionEvents.Disconnected')
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
// CRPlaywright uses this special id to issue Browser.close command which we
|
|
34
|
-
// should ignore.
|
|
35
|
-
const kBrowserCloseMessageId = exports.kBrowserCloseMessageId = -9999;
|
|
36
|
-
class CRConnection extends _events.EventEmitter {
|
|
37
|
-
constructor(transport, protocolLogger, browserLogsCollector) {
|
|
38
|
-
super();
|
|
39
|
-
this._lastId = 0;
|
|
40
|
-
this._transport = void 0;
|
|
41
|
-
this._sessions = new Map();
|
|
42
|
-
this._protocolLogger = void 0;
|
|
43
|
-
this._browserLogsCollector = void 0;
|
|
44
|
-
this._browserDisconnectedLogs = void 0;
|
|
45
|
-
this.rootSession = void 0;
|
|
46
|
-
this._closed = false;
|
|
47
|
-
this.setMaxListeners(0);
|
|
48
|
-
this._transport = transport;
|
|
49
|
-
this._protocolLogger = protocolLogger;
|
|
50
|
-
this._browserLogsCollector = browserLogsCollector;
|
|
51
|
-
this.rootSession = new CRSession(this, null, '');
|
|
52
|
-
this._sessions.set('', this.rootSession);
|
|
53
|
-
this._transport.onmessage = this._onMessage.bind(this);
|
|
54
|
-
// onclose should be set last, since it can be immediately called.
|
|
55
|
-
this._transport.onclose = this._onClose.bind(this);
|
|
56
|
-
}
|
|
57
|
-
_rawSend(sessionId, method, params) {
|
|
58
|
-
const id = ++this._lastId;
|
|
59
|
-
const message = {
|
|
60
|
-
id,
|
|
61
|
-
method,
|
|
62
|
-
params
|
|
63
|
-
};
|
|
64
|
-
if (sessionId) message.sessionId = sessionId;
|
|
65
|
-
this._protocolLogger('send', message);
|
|
66
|
-
this._transport.send(message);
|
|
67
|
-
return id;
|
|
68
|
-
}
|
|
69
|
-
async _onMessage(message) {
|
|
70
|
-
this._protocolLogger('receive', message);
|
|
71
|
-
if (message.id === kBrowserCloseMessageId) return;
|
|
72
|
-
const session = this._sessions.get(message.sessionId || '');
|
|
73
|
-
if (session) session._onMessage(message);
|
|
74
|
-
}
|
|
75
|
-
_onClose(reason) {
|
|
76
|
-
this._closed = true;
|
|
77
|
-
this._transport.onmessage = undefined;
|
|
78
|
-
this._transport.onclose = undefined;
|
|
79
|
-
this._browserDisconnectedLogs = _helper.helper.formatBrowserLogs(this._browserLogsCollector.recentLogs(), reason);
|
|
80
|
-
this.rootSession.dispose();
|
|
81
|
-
Promise.resolve().then(() => this.emit(ConnectionEvents.Disconnected));
|
|
82
|
-
}
|
|
83
|
-
close() {
|
|
84
|
-
if (!this._closed) this._transport.close();
|
|
85
|
-
}
|
|
86
|
-
async createBrowserSession() {
|
|
87
|
-
const {
|
|
88
|
-
sessionId
|
|
89
|
-
} = await this.rootSession.send('Target.attachToBrowserTarget');
|
|
90
|
-
return new CDPSession(this.rootSession, sessionId);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
exports.CRConnection = CRConnection;
|
|
94
|
-
class CRSession extends _events.EventEmitter {
|
|
95
|
-
constructor(connection, parentSession, sessionId, eventListener) {
|
|
96
|
-
super();
|
|
97
|
-
this._connection = void 0;
|
|
98
|
-
this._eventListener = void 0;
|
|
99
|
-
this._callbacks = new Map();
|
|
100
|
-
this._sessionId = void 0;
|
|
101
|
-
this._parentSession = void 0;
|
|
102
|
-
this._crashed = false;
|
|
103
|
-
this._closed = false;
|
|
104
|
-
this.on = void 0;
|
|
105
|
-
this.addListener = void 0;
|
|
106
|
-
this.off = void 0;
|
|
107
|
-
this.removeListener = void 0;
|
|
108
|
-
this.once = void 0;
|
|
109
|
-
this.setMaxListeners(0);
|
|
110
|
-
this._connection = connection;
|
|
111
|
-
this._parentSession = parentSession;
|
|
112
|
-
this._sessionId = sessionId;
|
|
113
|
-
this._eventListener = eventListener;
|
|
114
|
-
this.on = super.on;
|
|
115
|
-
this.addListener = super.addListener;
|
|
116
|
-
this.off = super.removeListener;
|
|
117
|
-
this.removeListener = super.removeListener;
|
|
118
|
-
this.once = super.once;
|
|
119
|
-
}
|
|
120
|
-
_markAsCrashed() {
|
|
121
|
-
this._crashed = true;
|
|
122
|
-
}
|
|
123
|
-
createChildSession(sessionId, eventListener) {
|
|
124
|
-
const session = new CRSession(this._connection, this, sessionId, eventListener);
|
|
125
|
-
this._connection._sessions.set(sessionId, session);
|
|
126
|
-
return session;
|
|
127
|
-
}
|
|
128
|
-
async send(method, params) {
|
|
129
|
-
if (this._crashed || this._closed || this._connection._closed || this._connection._browserDisconnectedLogs) throw new _protocolError.ProtocolError(this._crashed ? 'crashed' : 'closed', undefined, this._connection._browserDisconnectedLogs);
|
|
130
|
-
const id = this._connection._rawSend(this._sessionId, method, params);
|
|
131
|
-
return new Promise((resolve, reject) => {
|
|
132
|
-
this._callbacks.set(id, {
|
|
133
|
-
resolve,
|
|
134
|
-
reject,
|
|
135
|
-
error: new _protocolError.ProtocolError('error', method)
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
_sendMayFail(method, params) {
|
|
140
|
-
return this.send(method, params).catch(error => _debugLogger.debugLogger.log('error', error));
|
|
141
|
-
}
|
|
142
|
-
_onMessage(object) {
|
|
143
|
-
var _object$error;
|
|
144
|
-
if (object.id && this._callbacks.has(object.id)) {
|
|
145
|
-
const callback = this._callbacks.get(object.id);
|
|
146
|
-
this._callbacks.delete(object.id);
|
|
147
|
-
if (object.error) {
|
|
148
|
-
callback.error.setMessage(object.error.message);
|
|
149
|
-
callback.reject(callback.error);
|
|
150
|
-
} else {
|
|
151
|
-
callback.resolve(object.result);
|
|
152
|
-
}
|
|
153
|
-
} else if (object.id && ((_object$error = object.error) === null || _object$error === void 0 ? void 0 : _object$error.code) === -32001) {
|
|
154
|
-
// Message to a closed session, just ignore it.
|
|
155
|
-
} else {
|
|
156
|
-
var _object$error2;
|
|
157
|
-
(0, _utils.assert)(!object.id, (object === null || object === void 0 || (_object$error2 = object.error) === null || _object$error2 === void 0 ? void 0 : _object$error2.message) || undefined);
|
|
158
|
-
Promise.resolve().then(() => {
|
|
159
|
-
if (this._eventListener) this._eventListener(object.method, object.params);
|
|
160
|
-
this.emit(object.method, object.params);
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
async detach() {
|
|
165
|
-
if (this._closed) throw new Error(`Session already detached. Most likely the page has been closed.`);
|
|
166
|
-
if (!this._parentSession) throw new Error('Root session cannot be closed');
|
|
167
|
-
// Ideally, detaching should resume any target, but there is a bug in the backend,
|
|
168
|
-
// so we must Runtime.runIfWaitingForDebugger first.
|
|
169
|
-
await this._sendMayFail('Runtime.runIfWaitingForDebugger');
|
|
170
|
-
await this._parentSession.send('Target.detachFromTarget', {
|
|
171
|
-
sessionId: this._sessionId
|
|
172
|
-
});
|
|
173
|
-
this.dispose();
|
|
174
|
-
}
|
|
175
|
-
dispose() {
|
|
176
|
-
this._closed = true;
|
|
177
|
-
this._connection._sessions.delete(this._sessionId);
|
|
178
|
-
for (const callback of this._callbacks.values()) {
|
|
179
|
-
callback.error.setMessage(`Internal server error, session closed.`);
|
|
180
|
-
callback.error.type = this._crashed ? 'crashed' : 'closed';
|
|
181
|
-
callback.error.logs = this._connection._browserDisconnectedLogs;
|
|
182
|
-
callback.reject(callback.error);
|
|
183
|
-
}
|
|
184
|
-
this._callbacks.clear();
|
|
185
|
-
}
|
|
186
|
-
async __re__emitExecutionContext({
|
|
187
|
-
world,
|
|
188
|
-
targetId,
|
|
189
|
-
frame = null
|
|
190
|
-
}) {
|
|
191
|
-
const fixMode = process.env['REBROWSER_PATCHES_RUNTIME_FIX_MODE'] || 'addBinding';
|
|
192
|
-
const utilityWorldName = process.env['REBROWSER_PATCHES_UTILITY_WORLD_NAME'] !== '0' ? process.env['REBROWSER_PATCHES_UTILITY_WORLD_NAME'] || 'util' : '__playwright_utility_world__';
|
|
193
|
-
process.env['REBROWSER_PATCHES_DEBUG'] && console.log(`[rebrowser-patches][crSession] targetId = ${targetId}, world = ${world}, frame = ${frame ? 'Y' : 'N'}, fixMode = ${fixMode}`);
|
|
194
|
-
let getWorldPromise;
|
|
195
|
-
if (fixMode === 'addBinding') {
|
|
196
|
-
if (world === 'utility') {
|
|
197
|
-
getWorldPromise = this.__re__getIsolatedWorld({
|
|
198
|
-
client: this,
|
|
199
|
-
frameId: targetId,
|
|
200
|
-
worldName: utilityWorldName
|
|
201
|
-
}).then(contextId => {
|
|
202
|
-
return {
|
|
203
|
-
id: contextId,
|
|
204
|
-
// use UTILITY_WORLD_NAME value from crPage.ts otherwise _onExecutionContextCreated will ignore it
|
|
205
|
-
name: '__playwright_utility_world__',
|
|
206
|
-
auxData: {
|
|
207
|
-
frameId: targetId,
|
|
208
|
-
isDefault: false
|
|
209
|
-
}
|
|
210
|
-
};
|
|
211
|
-
});
|
|
212
|
-
} else if (world === 'main') {
|
|
213
|
-
getWorldPromise = this.__re__getMainWorld({
|
|
214
|
-
client: this,
|
|
215
|
-
frameId: targetId,
|
|
216
|
-
isWorker: frame === null
|
|
217
|
-
}).then(contextId => {
|
|
218
|
-
return {
|
|
219
|
-
id: contextId,
|
|
220
|
-
name: '',
|
|
221
|
-
auxData: {
|
|
222
|
-
frameId: targetId,
|
|
223
|
-
isDefault: true
|
|
224
|
-
}
|
|
225
|
-
};
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
} else if (fixMode === 'alwaysIsolated') {
|
|
229
|
-
// use only utility context
|
|
230
|
-
getWorldPromise = this.__re__getIsolatedWorld({
|
|
231
|
-
client: this,
|
|
232
|
-
frameId: targetId,
|
|
233
|
-
worldName: utilityWorldName
|
|
234
|
-
}).then(contextId => {
|
|
235
|
-
// make it look as main world
|
|
236
|
-
return {
|
|
237
|
-
id: contextId,
|
|
238
|
-
name: '',
|
|
239
|
-
auxData: {
|
|
240
|
-
frameId: targetId,
|
|
241
|
-
isDefault: true
|
|
242
|
-
}
|
|
243
|
-
};
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
const contextPayload = await getWorldPromise;
|
|
247
|
-
this.emit('Runtime.executionContextCreated', {
|
|
248
|
-
context: contextPayload
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
async __re__getMainWorld({
|
|
252
|
-
client,
|
|
253
|
-
frameId,
|
|
254
|
-
isWorker = false
|
|
255
|
-
}) {
|
|
256
|
-
let contextId;
|
|
257
|
-
|
|
258
|
-
// random name to make it harder to detect for any 3rd party script by watching window object and events
|
|
259
|
-
const randomName = [...Array(Math.floor(Math.random() * (10 + 1)) + 10)].map(() => Math.random().toString(36)[2]).join('');
|
|
260
|
-
process.env['REBROWSER_PATCHES_DEBUG'] && console.log(`[rebrowser-patches][getMainWorld] binding name = ${randomName}`);
|
|
261
|
-
|
|
262
|
-
// add the binding
|
|
263
|
-
await client.send('Runtime.addBinding', {
|
|
264
|
-
name: randomName
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
// listen for 'Runtime.bindingCalled' event
|
|
268
|
-
const bindingCalledHandler = ({
|
|
269
|
-
name,
|
|
270
|
-
payload,
|
|
271
|
-
executionContextId
|
|
272
|
-
}) => {
|
|
273
|
-
process.env['REBROWSER_PATCHES_DEBUG'] && console.log('[rebrowser-patches][bindingCalledHandler]', {
|
|
274
|
-
name,
|
|
275
|
-
payload,
|
|
276
|
-
executionContextId
|
|
277
|
-
});
|
|
278
|
-
if (contextId > 0) {
|
|
279
|
-
// already acquired the id
|
|
280
|
-
return;
|
|
281
|
-
}
|
|
282
|
-
if (name !== randomName) {
|
|
283
|
-
// ignore irrelevant bindings
|
|
284
|
-
return;
|
|
285
|
-
}
|
|
286
|
-
if (payload !== frameId) {
|
|
287
|
-
// ignore irrelevant frames
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
contextId = executionContextId;
|
|
291
|
-
// remove this listener
|
|
292
|
-
client.off('Runtime.bindingCalled', bindingCalledHandler);
|
|
293
|
-
};
|
|
294
|
-
client.on('Runtime.bindingCalled', bindingCalledHandler);
|
|
295
|
-
if (isWorker) {
|
|
296
|
-
// workers don't support `Page.addScriptToEvaluateOnNewDocument` and `Page.createIsolatedWorld`, but there are no iframes inside of them, so it's safe to just use Runtime.evaluate
|
|
297
|
-
await client.send('Runtime.evaluate', {
|
|
298
|
-
expression: `this['${randomName}']('${frameId}')`
|
|
299
|
-
});
|
|
300
|
-
} else {
|
|
301
|
-
// we could call the binding right from `addScriptToEvaluateOnNewDocument`, but this way it will be called in all existing frames and it's hard to distinguish children from the parent
|
|
302
|
-
await client.send('Page.addScriptToEvaluateOnNewDocument', {
|
|
303
|
-
source: `document.addEventListener('${randomName}', (e) => self['${randomName}'](e.detail.frameId))`,
|
|
304
|
-
runImmediately: true
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
// create new isolated world for this frame
|
|
308
|
-
const createIsolatedWorldResult = await client.send('Page.createIsolatedWorld', {
|
|
309
|
-
frameId,
|
|
310
|
-
// use randomName for worldName to distinguish from normal utility world
|
|
311
|
-
worldName: randomName,
|
|
312
|
-
grantUniveralAccess: true
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
// emit event in the specific frame from the isolated world
|
|
316
|
-
await client.send('Runtime.evaluate', {
|
|
317
|
-
expression: `document.dispatchEvent(new CustomEvent('${randomName}', { detail: { frameId: '${frameId}' } }))`,
|
|
318
|
-
contextId: createIsolatedWorldResult.executionContextId
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
process.env['REBROWSER_PATCHES_DEBUG'] && console.log(`[rebrowser-patches][getMainWorld] result:`, {
|
|
322
|
-
contextId
|
|
323
|
-
});
|
|
324
|
-
return contextId;
|
|
325
|
-
}
|
|
326
|
-
async __re__getIsolatedWorld({
|
|
327
|
-
client,
|
|
328
|
-
frameId,
|
|
329
|
-
worldName
|
|
330
|
-
}) {
|
|
331
|
-
const createIsolatedWorldResult = await client.send('Page.createIsolatedWorld', {
|
|
332
|
-
frameId,
|
|
333
|
-
worldName,
|
|
334
|
-
grantUniveralAccess: true
|
|
335
|
-
});
|
|
336
|
-
process.env['REBROWSER_PATCHES_DEBUG'] && console.log(`[rebrowser-patches][getIsolatedWorld] result:`, createIsolatedWorldResult);
|
|
337
|
-
return createIsolatedWorldResult.executionContextId;
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
exports.CRSession = CRSession;
|
|
341
|
-
class CDPSession extends _events.EventEmitter {
|
|
342
|
-
constructor(parentSession, sessionId) {
|
|
343
|
-
super();
|
|
344
|
-
this.guid = void 0;
|
|
345
|
-
this._session = void 0;
|
|
346
|
-
this._listeners = [];
|
|
347
|
-
this.guid = `cdp-session@${sessionId}`;
|
|
348
|
-
this._session = parentSession.createChildSession(sessionId, (method, params) => this.emit(CDPSession.Events.Event, {
|
|
349
|
-
method,
|
|
350
|
-
params
|
|
351
|
-
}));
|
|
352
|
-
this._listeners = [_utils.eventsHelper.addEventListener(parentSession, 'Target.detachedFromTarget', event => {
|
|
353
|
-
if (event.sessionId === sessionId) this._onClose();
|
|
354
|
-
})];
|
|
355
|
-
}
|
|
356
|
-
async send(method, params) {
|
|
357
|
-
return await this._session.send(method, params);
|
|
358
|
-
}
|
|
359
|
-
async detach() {
|
|
360
|
-
return await this._session.detach();
|
|
361
|
-
}
|
|
362
|
-
async attachToTarget(targetId) {
|
|
363
|
-
const {
|
|
364
|
-
sessionId
|
|
365
|
-
} = await this.send('Target.attachToTarget', {
|
|
366
|
-
targetId,
|
|
367
|
-
flatten: true
|
|
368
|
-
});
|
|
369
|
-
return new CDPSession(this._session, sessionId);
|
|
370
|
-
}
|
|
371
|
-
_onClose() {
|
|
372
|
-
_utils.eventsHelper.removeEventListeners(this._listeners);
|
|
373
|
-
this._session.dispose();
|
|
374
|
-
this.emit(CDPSession.Events.Closed);
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
exports.CDPSession = CDPSession;
|
|
378
|
-
CDPSession.Events = {
|
|
379
|
-
Event: 'event',
|
|
380
|
-
Closed: 'close'
|
|
381
|
-
};
|
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.CRCoverage = void 0;
|
|
7
|
-
var _eventsHelper = require("../../utils/eventsHelper");
|
|
8
|
-
var _utils = require("../../utils");
|
|
9
|
-
/**
|
|
10
|
-
* Copyright 2017 Google Inc. All rights reserved.
|
|
11
|
-
* Modifications copyright (c) Microsoft Corporation.
|
|
12
|
-
*
|
|
13
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
14
|
-
* you may not use this file except in compliance with the License.
|
|
15
|
-
* You may obtain a copy of the License at
|
|
16
|
-
*
|
|
17
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
18
|
-
*
|
|
19
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
20
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
21
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
22
|
-
* See the License for the specific language governing permissions and
|
|
23
|
-
* limitations under the License.
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
class CRCoverage {
|
|
27
|
-
constructor(client) {
|
|
28
|
-
this._jsCoverage = void 0;
|
|
29
|
-
this._cssCoverage = void 0;
|
|
30
|
-
this._jsCoverage = new JSCoverage(client);
|
|
31
|
-
this._cssCoverage = new CSSCoverage(client);
|
|
32
|
-
}
|
|
33
|
-
async startJSCoverage(options) {
|
|
34
|
-
return await this._jsCoverage.start(options);
|
|
35
|
-
}
|
|
36
|
-
async stopJSCoverage() {
|
|
37
|
-
return await this._jsCoverage.stop();
|
|
38
|
-
}
|
|
39
|
-
async startCSSCoverage(options) {
|
|
40
|
-
return await this._cssCoverage.start(options);
|
|
41
|
-
}
|
|
42
|
-
async stopCSSCoverage() {
|
|
43
|
-
return await this._cssCoverage.stop();
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
exports.CRCoverage = CRCoverage;
|
|
47
|
-
class JSCoverage {
|
|
48
|
-
constructor(client) {
|
|
49
|
-
this._client = void 0;
|
|
50
|
-
this._enabled = void 0;
|
|
51
|
-
this._scriptIds = void 0;
|
|
52
|
-
this._scriptSources = void 0;
|
|
53
|
-
this._eventListeners = void 0;
|
|
54
|
-
this._resetOnNavigation = void 0;
|
|
55
|
-
this._reportAnonymousScripts = false;
|
|
56
|
-
this._client = client;
|
|
57
|
-
this._enabled = false;
|
|
58
|
-
this._scriptIds = new Set();
|
|
59
|
-
this._scriptSources = new Map();
|
|
60
|
-
this._eventListeners = [];
|
|
61
|
-
this._resetOnNavigation = false;
|
|
62
|
-
}
|
|
63
|
-
async start(options) {
|
|
64
|
-
(0, _utils.assert)(!this._enabled, 'JSCoverage is already enabled');
|
|
65
|
-
const {
|
|
66
|
-
resetOnNavigation = true,
|
|
67
|
-
reportAnonymousScripts = false
|
|
68
|
-
} = options;
|
|
69
|
-
this._resetOnNavigation = resetOnNavigation;
|
|
70
|
-
this._reportAnonymousScripts = reportAnonymousScripts;
|
|
71
|
-
this._enabled = true;
|
|
72
|
-
this._scriptIds.clear();
|
|
73
|
-
this._scriptSources.clear();
|
|
74
|
-
this._eventListeners = [_eventsHelper.eventsHelper.addEventListener(this._client, 'Debugger.scriptParsed', this._onScriptParsed.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._client, 'Runtime.executionContextsCleared', this._onExecutionContextsCleared.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._client, 'Debugger.paused', this._onDebuggerPaused.bind(this))];
|
|
75
|
-
await Promise.all([this._client.send('Profiler.enable'), this._client.send('Profiler.startPreciseCoverage', {
|
|
76
|
-
callCount: true,
|
|
77
|
-
detailed: true
|
|
78
|
-
}), this._client.send('Debugger.enable'), this._client.send('Debugger.setSkipAllPauses', {
|
|
79
|
-
skip: true
|
|
80
|
-
})]);
|
|
81
|
-
}
|
|
82
|
-
_onDebuggerPaused() {
|
|
83
|
-
this._client.send('Debugger.resume');
|
|
84
|
-
}
|
|
85
|
-
_onExecutionContextsCleared() {
|
|
86
|
-
if (!this._resetOnNavigation) return;
|
|
87
|
-
this._scriptIds.clear();
|
|
88
|
-
this._scriptSources.clear();
|
|
89
|
-
}
|
|
90
|
-
async _onScriptParsed(event) {
|
|
91
|
-
this._scriptIds.add(event.scriptId);
|
|
92
|
-
// Ignore other anonymous scripts unless the reportAnonymousScripts option is true.
|
|
93
|
-
if (!event.url && !this._reportAnonymousScripts) return;
|
|
94
|
-
// This might fail if the page has already navigated away.
|
|
95
|
-
const response = await this._client._sendMayFail('Debugger.getScriptSource', {
|
|
96
|
-
scriptId: event.scriptId
|
|
97
|
-
});
|
|
98
|
-
if (response) this._scriptSources.set(event.scriptId, response.scriptSource);
|
|
99
|
-
}
|
|
100
|
-
async stop() {
|
|
101
|
-
(0, _utils.assert)(this._enabled, 'JSCoverage is not enabled');
|
|
102
|
-
this._enabled = false;
|
|
103
|
-
const [profileResponse] = await Promise.all([this._client.send('Profiler.takePreciseCoverage'), this._client.send('Profiler.stopPreciseCoverage'), this._client.send('Profiler.disable'), this._client.send('Debugger.disable')]);
|
|
104
|
-
_eventsHelper.eventsHelper.removeEventListeners(this._eventListeners);
|
|
105
|
-
const coverage = {
|
|
106
|
-
entries: []
|
|
107
|
-
};
|
|
108
|
-
for (const entry of profileResponse.result) {
|
|
109
|
-
if (!this._scriptIds.has(entry.scriptId)) continue;
|
|
110
|
-
if (!entry.url && !this._reportAnonymousScripts) continue;
|
|
111
|
-
const source = this._scriptSources.get(entry.scriptId);
|
|
112
|
-
if (source) coverage.entries.push({
|
|
113
|
-
...entry,
|
|
114
|
-
source
|
|
115
|
-
});else coverage.entries.push(entry);
|
|
116
|
-
}
|
|
117
|
-
return coverage;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
class CSSCoverage {
|
|
121
|
-
constructor(client) {
|
|
122
|
-
this._client = void 0;
|
|
123
|
-
this._enabled = void 0;
|
|
124
|
-
this._stylesheetURLs = void 0;
|
|
125
|
-
this._stylesheetSources = void 0;
|
|
126
|
-
this._eventListeners = void 0;
|
|
127
|
-
this._resetOnNavigation = void 0;
|
|
128
|
-
this._client = client;
|
|
129
|
-
this._enabled = false;
|
|
130
|
-
this._stylesheetURLs = new Map();
|
|
131
|
-
this._stylesheetSources = new Map();
|
|
132
|
-
this._eventListeners = [];
|
|
133
|
-
this._resetOnNavigation = false;
|
|
134
|
-
}
|
|
135
|
-
async start(options) {
|
|
136
|
-
(0, _utils.assert)(!this._enabled, 'CSSCoverage is already enabled');
|
|
137
|
-
const {
|
|
138
|
-
resetOnNavigation = true
|
|
139
|
-
} = options;
|
|
140
|
-
this._resetOnNavigation = resetOnNavigation;
|
|
141
|
-
this._enabled = true;
|
|
142
|
-
this._stylesheetURLs.clear();
|
|
143
|
-
this._stylesheetSources.clear();
|
|
144
|
-
this._eventListeners = [_eventsHelper.eventsHelper.addEventListener(this._client, 'CSS.styleSheetAdded', this._onStyleSheet.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._client, 'Runtime.executionContextsCleared', this._onExecutionContextsCleared.bind(this))];
|
|
145
|
-
await Promise.all([this._client.send('DOM.enable'), this._client.send('CSS.enable'), this._client.send('CSS.startRuleUsageTracking')]);
|
|
146
|
-
}
|
|
147
|
-
_onExecutionContextsCleared() {
|
|
148
|
-
if (!this._resetOnNavigation) return;
|
|
149
|
-
this._stylesheetURLs.clear();
|
|
150
|
-
this._stylesheetSources.clear();
|
|
151
|
-
}
|
|
152
|
-
async _onStyleSheet(event) {
|
|
153
|
-
const header = event.header;
|
|
154
|
-
// Ignore anonymous scripts
|
|
155
|
-
if (!header.sourceURL) return;
|
|
156
|
-
// This might fail if the page has already navigated away.
|
|
157
|
-
const response = await this._client._sendMayFail('CSS.getStyleSheetText', {
|
|
158
|
-
styleSheetId: header.styleSheetId
|
|
159
|
-
});
|
|
160
|
-
if (response) {
|
|
161
|
-
this._stylesheetURLs.set(header.styleSheetId, header.sourceURL);
|
|
162
|
-
this._stylesheetSources.set(header.styleSheetId, response.text);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
async stop() {
|
|
166
|
-
(0, _utils.assert)(this._enabled, 'CSSCoverage is not enabled');
|
|
167
|
-
this._enabled = false;
|
|
168
|
-
const ruleTrackingResponse = await this._client.send('CSS.stopRuleUsageTracking');
|
|
169
|
-
await Promise.all([this._client.send('CSS.disable'), this._client.send('DOM.disable')]);
|
|
170
|
-
_eventsHelper.eventsHelper.removeEventListeners(this._eventListeners);
|
|
171
|
-
|
|
172
|
-
// aggregate by styleSheetId
|
|
173
|
-
const styleSheetIdToCoverage = new Map();
|
|
174
|
-
for (const entry of ruleTrackingResponse.ruleUsage) {
|
|
175
|
-
let ranges = styleSheetIdToCoverage.get(entry.styleSheetId);
|
|
176
|
-
if (!ranges) {
|
|
177
|
-
ranges = [];
|
|
178
|
-
styleSheetIdToCoverage.set(entry.styleSheetId, ranges);
|
|
179
|
-
}
|
|
180
|
-
ranges.push({
|
|
181
|
-
startOffset: entry.startOffset,
|
|
182
|
-
endOffset: entry.endOffset,
|
|
183
|
-
count: entry.used ? 1 : 0
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
const coverage = {
|
|
187
|
-
entries: []
|
|
188
|
-
};
|
|
189
|
-
for (const styleSheetId of this._stylesheetURLs.keys()) {
|
|
190
|
-
const url = this._stylesheetURLs.get(styleSheetId);
|
|
191
|
-
const text = this._stylesheetSources.get(styleSheetId);
|
|
192
|
-
const ranges = convertToDisjointRanges(styleSheetIdToCoverage.get(styleSheetId) || []);
|
|
193
|
-
coverage.entries.push({
|
|
194
|
-
url,
|
|
195
|
-
ranges,
|
|
196
|
-
text
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
return coverage;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
function convertToDisjointRanges(nestedRanges) {
|
|
203
|
-
const points = [];
|
|
204
|
-
for (const range of nestedRanges) {
|
|
205
|
-
points.push({
|
|
206
|
-
offset: range.startOffset,
|
|
207
|
-
type: 0,
|
|
208
|
-
range
|
|
209
|
-
});
|
|
210
|
-
points.push({
|
|
211
|
-
offset: range.endOffset,
|
|
212
|
-
type: 1,
|
|
213
|
-
range
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
// Sort points to form a valid parenthesis sequence.
|
|
217
|
-
points.sort((a, b) => {
|
|
218
|
-
// Sort with increasing offsets.
|
|
219
|
-
if (a.offset !== b.offset) return a.offset - b.offset;
|
|
220
|
-
// All "end" points should go before "start" points.
|
|
221
|
-
if (a.type !== b.type) return b.type - a.type;
|
|
222
|
-
const aLength = a.range.endOffset - a.range.startOffset;
|
|
223
|
-
const bLength = b.range.endOffset - b.range.startOffset;
|
|
224
|
-
// For two "start" points, the one with longer range goes first.
|
|
225
|
-
if (a.type === 0) return bLength - aLength;
|
|
226
|
-
// For two "end" points, the one with shorter range goes first.
|
|
227
|
-
return aLength - bLength;
|
|
228
|
-
});
|
|
229
|
-
const hitCountStack = [];
|
|
230
|
-
const results = [];
|
|
231
|
-
let lastOffset = 0;
|
|
232
|
-
// Run scanning line to intersect all ranges.
|
|
233
|
-
for (const point of points) {
|
|
234
|
-
if (hitCountStack.length && lastOffset < point.offset && hitCountStack[hitCountStack.length - 1] > 0) {
|
|
235
|
-
const lastResult = results.length ? results[results.length - 1] : null;
|
|
236
|
-
if (lastResult && lastResult.end === lastOffset) lastResult.end = point.offset;else results.push({
|
|
237
|
-
start: lastOffset,
|
|
238
|
-
end: point.offset
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
lastOffset = point.offset;
|
|
242
|
-
if (point.type === 0) hitCountStack.push(point.range.count);else hitCountStack.pop();
|
|
243
|
-
}
|
|
244
|
-
// Filter out empty ranges.
|
|
245
|
-
return results.filter(range => range.end - range.start > 1);
|
|
246
|
-
}
|