From 31e269ad06c8cada6e53313403682479349e6b4f Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Mon, 9 Sep 2024 14:00:22 +0200 Subject: [PATCH] feat(trace-viewer): show screenshot pointer (#32514) Follow-up to https://github.com/microsoft/playwright/pull/32248. Adds a glowing red circle that shows the click position. I made it glowing to show that its position is inaccurate. Screenshot 2024-09-09 at 11 33 45 --- packages/trace-viewer/src/ui/clickPointer.tsx | 48 +++++++++++++++++++ packages/trace-viewer/src/ui/snapshotTab.tsx | 12 +++-- 2 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 packages/trace-viewer/src/ui/clickPointer.tsx diff --git a/packages/trace-viewer/src/ui/clickPointer.tsx b/packages/trace-viewer/src/ui/clickPointer.tsx new file mode 100644 index 0000000000..862f6522ea --- /dev/null +++ b/packages/trace-viewer/src/ui/clickPointer.tsx @@ -0,0 +1,48 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export function ClickPointer({ point }: { point: { x: number; y: number } }) { + return ( +
+
+ ⚠ +
+
+ ); +} diff --git a/packages/trace-viewer/src/ui/snapshotTab.tsx b/packages/trace-viewer/src/ui/snapshotTab.tsx index 229d9f8cef..05d0cc5918 100644 --- a/packages/trace-viewer/src/ui/snapshotTab.tsx +++ b/packages/trace-viewer/src/ui/snapshotTab.tsx @@ -29,6 +29,7 @@ import type { Language } from '@isomorphic/locatorGenerators'; import { locatorOrSelectorAsSelector } from '@isomorphic/locatorParser'; import { TabbedPaneTab } from '@web/components/tabbedPane'; import { BrowserFrame } from './browserFrame'; +import { ClickPointer } from './clickPointer'; function findClosest(items: T[], target: number) { return items.find((item, index) => { @@ -73,7 +74,7 @@ export const SnapshotTab: React.FunctionComponent<{ return { snapshots: { action: actionSnapshot, before: beforeSnapshot, after: afterSnapshot } }; }, [action]); - const { snapshotInfoUrl, snapshotUrl, popoutUrl } = React.useMemo(() => { + const { snapshotInfoUrl, snapshotUrl, popoutUrl, point } = React.useMemo(() => { const snapshot = snapshots[snapshotTab]; if (!snapshot) return { snapshotUrl: kBlankSnapshotUrl }; @@ -96,7 +97,7 @@ export const SnapshotTab: React.FunctionComponent<{ popoutParams.set('pointY', String(snapshot.point.y)); } const popoutUrl = new URL(`snapshot.html?${popoutParams.toString()}`, window.location.href).toString(); - return { snapshots, snapshotInfoUrl, snapshotUrl, popoutUrl }; + return { snapshots, snapshotInfoUrl, snapshotUrl, popoutUrl, point: snapshot.point }; }, [snapshots, snapshotTab]); const iframeRef0 = React.useRef(null); @@ -230,7 +231,12 @@ export const SnapshotTab: React.FunctionComponent<{ transform: `translate(${translate.x}px, ${translate.y}px) scale(${scale})`, }}> - {(showScreenshotInsteadOfSnapshot && screencastFrame) && {`Screenshot ${renderTitle(snapshotTab)}`} src={`sha1/${screencastFrame.sha1}`} width={screencastFrame.width} height={screencastFrame.height} />} + {(showScreenshotInsteadOfSnapshot && screencastFrame) && ( + <> + {point && } + {`Screenshot ${renderTitle(snapshotTab)}`} src={`sha1/${screencastFrame.sha1}`} width={screencastFrame.width} height={screencastFrame.height} /> + + )}