From dcce65d04f2860bf74d597387de7a625eec6aed3 Mon Sep 17 00:00:00 2001
From: Devin McIntyre <devin.mcintyre@ricoh-usa.com>
Date: Tue, 15 Oct 2024 12:47:34 -0600
Subject: [PATCH] fix(test-runner-coverage-v8): #2825 ignore invalid URLs
 during code coverage conversion

---
 .changeset/eleven-seahorses-wave.md           |  5 +++
 packages/test-runner-coverage-v8/src/index.ts | 42 +++++++++++--------
 2 files changed, 29 insertions(+), 18 deletions(-)
 create mode 100644 .changeset/eleven-seahorses-wave.md

diff --git a/.changeset/eleven-seahorses-wave.md b/.changeset/eleven-seahorses-wave.md
new file mode 100644
index 000000000..67bfe72c2
--- /dev/null
+++ b/.changeset/eleven-seahorses-wave.md
@@ -0,0 +1,5 @@
+---
+'@web/test-runner-coverage-v8': patch
+---
+
+fix(test-runner-coverage-v8): #2825 ignore invalid URLs during code coverage conversion
diff --git a/packages/test-runner-coverage-v8/src/index.ts b/packages/test-runner-coverage-v8/src/index.ts
index 306f53086..e95a4aef2 100644
--- a/packages/test-runner-coverage-v8/src/index.ts
+++ b/packages/test-runner-coverage-v8/src/index.ts
@@ -66,21 +66,27 @@ export async function v8ToIstanbul(
   const istanbulCoverage: CoverageMapData = {};
 
   for (const entry of coverage) {
-    const url = new URL(entry.url);
-    const path = url.pathname;
-    if (
-      // ignore non-http protocols (for exmaple webpack://)
-      url.protocol.startsWith('http') &&
-      // ignore external urls
-      url.hostname === config.hostname &&
-      url.port === `${config.port}` &&
-      // ignore non-files
-      !!extname(path) &&
-      // ignore virtual files
-      !path.startsWith('/__web-test-runner') &&
-      !path.startsWith('/__web-dev-server')
-    ) {
-      try {
+    let url;
+    try {
+      url = new URL(entry.url);
+    } catch (_) {
+      // ignore invalid URLs
+      continue;
+    }
+    try {
+      const path = url.pathname;
+      if (
+        // ignore non-http protocols (for example webpack://)
+        url.protocol.startsWith('http') &&
+        // ignore external urls
+        url.hostname === config.hostname &&
+        url.port === `${config.port}` &&
+        // ignore non-files
+        !!extname(path) &&
+        // ignore virtual files
+        !path.startsWith('/__web-test-runner') &&
+        !path.startsWith('/__web-dev-server')
+      ) {
         const filePath = join(config.rootDir, toFilePath(path));
 
         if (!testFiles.includes(filePath) && included(filePath) && !excluded(filePath)) {
@@ -110,10 +116,10 @@ export async function v8ToIstanbul(
           converter.applyCoverage(entry.functions);
           Object.assign(istanbulCoverage, converter.toIstanbul());
         }
-      } catch (error) {
-        console.error(`Error while generating code coverage for ${entry.url}.`);
-        console.error(error);
       }
+    } catch (error) {
+      console.error(`Error while generating code coverage for ${entry.url}.`);
+      console.error(error);
     }
   }