From 48317af1cc938955c357f9e33d921183f2e6dcae Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Fri, 12 Jan 2024 12:11:39 -0800 Subject: [PATCH] feat(trace): preserve noscript when javascript is disabled (#28971) Closes #27504, closes #27532. --- .../src/server/trace/recorder/snapshotter.ts | 2 +- .../trace/recorder/snapshotterInjected.ts | 5 ++--- packages/trace-viewer/src/snapshotRenderer.ts | 21 +++++++++++-------- tests/library/trace-viewer.spec.ts | 18 ++++++++++++++++ 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/packages/playwright-core/src/server/trace/recorder/snapshotter.ts b/packages/playwright-core/src/server/trace/recorder/snapshotter.ts index 2340f55a26..30bb86c8bf 100644 --- a/packages/playwright-core/src/server/trace/recorder/snapshotter.ts +++ b/packages/playwright-core/src/server/trace/recorder/snapshotter.ts @@ -86,7 +86,7 @@ export class Snapshotter { eventsHelper.addEventListener(this._context, BrowserContext.Events.Page, this._onPage.bind(this)), ]; - const initScript = `(${frameSnapshotStreamer})("${this._snapshotStreamer}")`; + const initScript = `(${frameSnapshotStreamer})("${this._snapshotStreamer}", ${!!this._context._options.javaScriptEnabled})`; await this._context.addInitScript(initScript); await this._runInAllFrames(initScript); } diff --git a/packages/playwright-core/src/server/trace/recorder/snapshotterInjected.ts b/packages/playwright-core/src/server/trace/recorder/snapshotterInjected.ts index 7a2dfd4462..22ece79459 100644 --- a/packages/playwright-core/src/server/trace/recorder/snapshotterInjected.ts +++ b/packages/playwright-core/src/server/trace/recorder/snapshotterInjected.ts @@ -31,7 +31,7 @@ export type SnapshotData = { collectionTime: number, }; -export function frameSnapshotStreamer(snapshotStreamer: string) { +export function frameSnapshotStreamer(snapshotStreamer: string, removeNoScript: boolean) { // Communication with Playwright. if ((window as any)[snapshotStreamer]) return; @@ -81,7 +81,6 @@ export function frameSnapshotStreamer(snapshotStreamer: string) { } class Streamer { - private _removeNoScript = true; private _lastSnapshotNumber = 0; private _staleStyleSheets = new Set(); private _readingStyleSheet = false; // To avoid invalidating due to our own reads. @@ -337,7 +336,7 @@ export function frameSnapshotStreamer(snapshotStreamer: string) { if (rel === 'preload' || rel === 'prefetch') return; } - if (this._removeNoScript && nodeName === 'NOSCRIPT') + if (removeNoScript && nodeName === 'NOSCRIPT') return; if (nodeName === 'META' && (node as HTMLMetaElement).httpEquiv.toLowerCase() === 'content-security-policy') return; diff --git a/packages/trace-viewer/src/snapshotRenderer.ts b/packages/trace-viewer/src/snapshotRenderer.ts index 81e62126c5..9642c7c1ad 100644 --- a/packages/trace-viewer/src/snapshotRenderer.ts +++ b/packages/trace-viewer/src/snapshotRenderer.ts @@ -65,15 +65,18 @@ export class SnapshotRenderer { } } else if (typeof n[0] === 'string') { // Element node. - const builder: string[] = []; - builder.push('<', n[0]); + // Note that