diff --git a/packages/playwright-core/src/web/traceViewer/index.tsx b/packages/playwright-core/src/web/traceViewer/index.tsx
index d2b3f6254e..b500dd6d66 100644
--- a/packages/playwright-core/src/web/traceViewer/index.tsx
+++ b/packages/playwright-core/src/web/traceViewer/index.tsx
@@ -29,5 +29,7 @@ import '../common.css';
navigator.serviceWorker.oncontrollerchange = () => f();
});
}
+ // Keep SW running.
+ setInterval(function() { fetch('ping'); }, 10000);
ReactDOM.render(, document.querySelector('#root'));
})();
diff --git a/packages/playwright-core/src/web/traceViewer/sw.ts b/packages/playwright-core/src/web/traceViewer/sw.ts
index 8e7880904d..bd4d846b70 100644
--- a/packages/playwright-core/src/web/traceViewer/sw.ts
+++ b/packages/playwright-core/src/web/traceViewer/sw.ts
@@ -56,8 +56,12 @@ async function doFetch(event: FetchEvent): Promise {
const url = new URL(request.url);
const relativePath = url.pathname.substring(scopePath.length - 1);
- if (relativePath === '/context') {
+ if (relativePath === '/ping') {
await gc();
+ return new Response(null, { status: 200 });
+ }
+
+ if (relativePath === '/context') {
const traceModel = await loadTrace(traceUrl, event.clientId);
return new Response(JSON.stringify(traceModel!.contextEntry), {
status: 200,