Skip to content

Commit 26219d5

Browse files
authored
fix(trace-viewer): validate snapshot popout ?r= scheme (#40546)
1 parent d6041b5 commit 26219d5

4 files changed

Lines changed: 42 additions & 16 deletions

File tree

packages/isomorphic/urlMatch.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616

1717
import { isString } from './stringUtils';
1818

19-
export function isHttpUrl(url: string): boolean {
19+
export function isHttpUrl(url: string, base?: string): boolean {
2020
try {
21-
return ['http:', 'https:'].includes(new URL(url).protocol);
21+
return ['http:', 'https:'].includes(new URL(url, base).protocol);
2222
} catch {
2323
return false;
2424
}

packages/trace-viewer/snapshot.html

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,6 @@
1717
<html lang="en">
1818
<body>
1919
<iframe src="about:blank" sandbox="allow-same-origin allow-scripts" style="position:absolute;top:0;left:0;right:0;bottom:0;width:100%;height:100%;border:none;"></iframe>
20-
<script>
21-
(async () => {
22-
if (!navigator.serviceWorker)
23-
throw new Error(`Service workers are not supported.\nMake sure to serve the Trace Viewer (${window.location}) via HTTPS or localhost.`);
24-
navigator.serviceWorker.register('sw.bundle.js');
25-
if (!navigator.serviceWorker.controller)
26-
await new Promise(f => navigator.serviceWorker.oncontrollerchange = f);
27-
const traceUrl = new URL(location.href).searchParams.get('trace');
28-
const params = new URLSearchParams();
29-
params.set('trace', traceUrl);
30-
await fetch('contexts?' + params.toString());
31-
document.querySelector('iframe').src = new URLSearchParams(location.search).get('r');
32-
})();
33-
</script>
20+
<script type="module" src="/src/snapshotMain.ts"></script>
3421
</body>
3522
</html>

packages/trace-viewer/src/DEPS.list

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,8 @@
22
@web/**
33
ui/
44

5+
[snapshotMain.ts]
6+
@isomorphic/**
7+
58
[sw-main.ts]
69
sw/**
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
Copyright (c) Microsoft Corporation.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
import { isHttpUrl } from '@isomorphic/urlMatch';
18+
19+
(async () => {
20+
if (!navigator.serviceWorker)
21+
throw new Error(`Service workers are not supported.\nMake sure to serve the Trace Viewer (${window.location}) via HTTPS or localhost.`);
22+
navigator.serviceWorker.register('sw.bundle.js');
23+
if (!navigator.serviceWorker.controller)
24+
await new Promise(f => navigator.serviceWorker.oncontrollerchange = f);
25+
const traceUrl = new URL(location.href).searchParams.get('trace');
26+
const params = new URLSearchParams();
27+
if (traceUrl)
28+
params.set('trace', traceUrl);
29+
await fetch('contexts?' + params.toString());
30+
const r = new URLSearchParams(location.search).get('r');
31+
if (!r || !isHttpUrl(r, location.href))
32+
return;
33+
const iframe = document.querySelector('iframe');
34+
if (iframe)
35+
iframe.src = r;
36+
})();

0 commit comments

Comments
 (0)