Repository: GoogleChrome/lighthouse (js)

Issue:
Remove unused extendedInfo field from audits
A handful of audits are still setting the extendedInfo in their return value. Since extendedInfo has been wholly replaced by 'details' and 'debugData', it's no point in keeping it since it doesn't even make it into the LHR json.

Pull request:
core: remove uses of deprecated extendedInfo field
This PR removes the remaining usage of 'extendedInfo' which has been deprecated for a while. For each of the audits, extendedInfo was moved into debugData if it hasn't been replicated in the audit details already.

Closes #10567 

Patch:
diff --git a/lighthouse-core/audits/accessibility/axe-audit.js b/lighthouse-core/audits/accessibility/axe-audit.js
index 0713b7035..14ad468e9 100644
--- a/lighthouse-core/audits/accessibility/axe-audit.js
+++ b/lighthouse-core/audits/accessibility/axe-audit.js
@@ -103,9 +103,6 @@ class AxeAudit extends Audit {
 
     return {
       score: Number(rule === undefined),
-      extendedInfo: {
-        value: rule,
-      },
       details: {...Audit.makeTableDetails(headings, items), debugData},
     };
   }
diff --git a/lighthouse-core/audits/byte-efficiency/byte-efficiency-audit.js b/lighthouse-core/audits/byte-efficiency/byte-efficiency-audit.js
index 8c9a96a9a..bdb8bb19e 100644
--- a/lighthouse-core/audits/byte-efficiency/byte-efficiency-audit.js
+++ b/lighthouse-core/audits/byte-efficiency/byte-efficiency-audit.js
@@ -18,8 +18,6 @@ const str_ = i18n.createMessageInstanceIdFn(__filename, {});
 /** @typedef {import('../../lib/dependency-graph/simulator/simulator')} Simulator */
 /** @typedef {import('../../lib/dependency-graph/base-node.js').Node} Node */
 
-const KB_IN_BYTES = 1024;
-
 const WASTED_MS_FOR_AVERAGE = 300;
 const WASTED_MS_FOR_POOR = 750;
 const WASTED_MS_FOR_SCORE_OF_ZERO = 5000;
@@ -198,7 +196,6 @@ class UnusedBytes extends Audit {
     const results = result.items.sort((itemA, itemB) => itemB.wastedBytes - itemA.wastedBytes);
 
     const wastedBytes = results.reduce((sum, item) => sum + item.wastedBytes, 0);
-    const wastedKb = Math.round(wastedBytes / KB_IN_BYTES);
     const wastedMs = this.computeWasteWithTTIGraph(results, graph, simulator, {
       providedWastedBytesByUrl: result.wastedBytesByUrl,
     });
@@ -217,13 +214,6 @@ class UnusedBytes extends Audit {
       numericValue: wastedMs,
       numericUnit: 'millisecond',
       score: UnusedBytes.scoreForWastedMs(wastedMs),
-      extendedInfo: {
-        value: {
-          wastedMs,
-          wastedKb,
-          results,
-        },
-      },
       details,
     };
   }
diff --git a/lighthouse-core/audits/byte-efficiency/total-byte-weight.js b/lighthouse-core/audits/byte-efficiency/total-byte-weight.js
index 16fecfc6b..2980a8791 100644
--- a/lighthouse-core/audits/byte-efficiency/total-byte-weight.js
+++ b/lighthouse-core/audits/byte-efficiency/total-byte-weight.js
@@ -78,7 +78,6 @@ class TotalByteWeight extends ByteEfficiencyAudit {
       totalBytes += result.totalBytes;
       results.push(result);
     });
-    const totalCompletedRequests = results.length;
     results = results.sort((itemA, itemB) => {
       return itemB.totalBytes - itemA.totalBytes ||
         itemA.url.localeCompare(itemB.url);
@@ -102,12 +101,6 @@ class TotalByteWeight extends ByteEfficiencyAudit {
       numericValue: totalBytes,
       numericUnit: 'byte',
       displayValue: str_(UIStrings.displayValue, {totalBytes}),
-      extendedInfo: {
-        value: {
-          results,
-          totalCompletedRequests,
-        },
-      },
       details: tableDetails,
     };
   }
diff --git a/lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js b/lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js
index 1b26b1324..a943e251f 100644
--- a/lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js
+++ b/lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js
@@ -196,7 +196,6 @@ class CacheHeaders extends Audit {
     const devtoolsLogs = artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
     return NetworkRecords.request(devtoolsLogs, context).then(records => {
       const results = [];
-      let queryStringCount = 0;
       let totalWastedBytes = 0;
 
       for (const record of records) {
@@ -237,7 +236,6 @@ class CacheHeaders extends Audit {
         const wastedBytes = (1 - cacheHitProbability) * totalBytes;
 
         totalWastedBytes += wastedBytes;
-        if (url.includes('?')) queryStringCount++;
 
         // Include cacheControl info (if it exists) per url as a diagnostic.
         /** @type {LH.Audit.Details.DebugData|undefined} */
@@ -288,12 +286,6 @@ class CacheHeaders extends Audit {
         numericValue: totalWastedBytes,
         numericUnit: 'byte',
         displayValue: str_(UIStrings.displayValue, {itemCount: results.length}),
-        extendedInfo: {
-          value: {
-            results,
-            queryStringCount,
-          },
-        },
         details,
       };
     });
diff --git a/lighthouse-core/audits/critical-request-chains.js b/lighthouse-core/audits/critical-request-chains.js
index 20e4ba62b..462fb330b 100644
--- a/lighthouse-core/audits/critical-request-chains.js
+++ b/lighthouse-core/audits/critical-request-chains.js
@@ -204,12 +204,6 @@ class CriticalRequestChains extends Audit {
         score: Number(chainCount === 0),
         notApplicable: chainCount === 0,
         displayValue: chainCount ? str_(UIStrings.displayValue, {itemCount: chainCount}) : '',
-        extendedInfo: {
-          value: {
-            chains: flattenedChains,
-            longestChain,
-          },
-        },
         details: {
           type: /** @type {'criticalrequestchain'} */('criticalrequestchain'),
           chains: flattenedChains,
diff --git a/lighthouse-core/audits/deprecations.js b/lighthouse-core/audits/deprecations.js
index 26d71c5d1..dce727b20 100644
--- a/lighthouse-core/audits/deprecations.js
+++ b/lighthouse-core/audits/deprecations.js
@@ -95,9 +95,6 @@ class Deprecations extends Audit {
     return {
       score: Number(deprecations.length === 0),
       displayValue,
-      extendedInfo: {
-        value: deprecations,
-      },
       details,
     };
   }
diff --git a/lighthouse-core/audits/dobetterweb/dom-size.js b/lighthouse-core/audits/dobetterweb/dom-size.js
index bd29dd1c6..c39b561ba 100644
--- a/lighthouse-core/audits/dobetterweb/dom-size.js
+++ b/lighthouse-core/audits/dobetterweb/dom-size.js
@@ -125,9 +125,6 @@ class DOMSize extends Audit {
       numericValue: stats.totalBodyElements,
       numericUnit: 'element',
       displayValue: str_(UIStrings.displayValue, {itemCount: stats.totalBodyElements}),
-      extendedInfo: {
-        value: items,
-      },
       details: Audit.makeTableDetails(headings, items),
     };
   }
diff --git a/lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js b/lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js
index dea667d63..b972be569 100644
--- a/lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js
+++ b/lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js
@@ -92,9 +92,6 @@ class ExternalAnchorsUseRelNoopenerAudit extends Audit {
 
     return {
       score: Number(failingAnchors.length === 0),
-      extendedInfo: {
-        value: failingAnchors,
-      },
       details,
       warnings,
     };
diff --git a/lighthouse-core/audits/dobetterweb/geolocation-on-start.js b/lighthouse-core/audits/dobetterweb/geolocation-on-start.js
index 764fb244a..9fb35e3ee 100644
--- a/lighthouse-core/audits/dobetterweb/geolocation-on-start.js
+++ b/lighthouse-core/audits/dobetterweb/geolocation-on-start.js
@@ -60,9 +60,6 @@ class GeolocationOnStart extends ViolationAudit {
 
     return {
       score: Number(results.length === 0),
-      extendedInfo: {
-        value: results,
-      },
       details,
     };
   }
diff --git a/lighthouse-core/audits/dobetterweb/no-document-write.js b/lighthouse-core/audits/dobetterweb/no-document-write.js
index 63e757435..90cd0f006 100644
--- a/lighthouse-core/audits/dobetterweb/no-document-write.js
+++ b/lighthouse-core/audits/dobetterweb/no-document-write.js
@@ -75,9 +75,6 @@ class NoDocWriteAudit extends ViolationAudit {
 
     return {
       score: Number(results.length === 0),
-      extendedInfo: {
-        value: results,
-      },
       details,
     };
   }
diff --git a/lighthouse-core/audits/dobetterweb/no-vulnerable-libraries.js b/lighthouse-core/audits/dobetterweb/no-vulnerable-libraries.js
index 27441e8af..e3758f2c2 100644
--- a/lighthouse-core/audits/dobetterweb/no-vulnerable-libraries.js
+++ b/lighthouse-core/audits/dobetterweb/no-vulnerable-libraries.js
@@ -184,7 +184,7 @@ class NoVulnerableLibrariesAudit extends Audit {
     /** @type {Array<{highestSeverity: string, vulnCount: number, detectedLib: LH.Audit.Details.LinkValue}>} */
     const vulnerabilityResults = [];
 
-    const libraryVulns = foundLibraries.map(lib => {
+    for (const lib of foundLibraries) {
       const version = this.normalizeVersion(lib.version) || '';
       const vulns = this.getVulnerabilities(version, lib, snykDB);
       const vulnCount = vulns.length;
@@ -204,15 +204,7 @@ class NoVulnerableLibrariesAudit extends Audit {
           },
         });
       }
-
-      return {
-        name: lib.name,
-        npmPkgName: lib.npm,
-        version,
-        vulns,
-        highestSeverity,
-      };
-    });
+    }
 
     let displayValue = '';
     if (totalVulns > 0) {
@@ -230,10 +222,6 @@ class NoVulnerableLibrariesAudit extends Audit {
     return {
       score: Number(totalVulns === 0),
       displayValue,
-      extendedInfo: {
-        jsLibs: libraryVulns,
-        vulnerabilities: vulnerabilityResults,
-      },
       details,
     };
   }
diff --git a/lighthouse-core/audits/dobetterweb/notification-on-start.js b/lighthouse-core/audits/dobetterweb/notification-on-start.js
index b078dbb59..ec008645c 100644
--- a/lighthouse-core/audits/dobetterweb/notification-on-start.js
+++ b/lighthouse-core/audits/dobetterweb/notification-on-start.js
@@ -58,9 +58,6 @@ class NotificationOnStart extends ViolationAudit {
 
     return {
       score: Number(results.length === 0),
-      extendedInfo: {
-        value: results,
-      },
       details,
     };
   }
diff --git a/lighthouse-core/audits/dobetterweb/password-inputs-can-be-pasted-into.js b/lighthouse-core/audits/dobetterweb/password-inputs-can-be-pasted-into.js
index 539ec7201..b262e5ba6 100644
--- a/lighthouse-core/audits/dobetterweb/password-inputs-can-be-pasted-into.js
+++ b/lighthouse-core/audits/dobetterweb/password-inputs-can-be-pasted-into.js
@@ -58,9 +58,6 @@ class PasswordInputsCanBePastedIntoAudit extends Audit {
 
     return {
       score: Number(passwordInputsWithPreventedPaste.length === 0),
-      extendedInfo: {
-        value: passwordInputsWithPreventedPaste,
-      },
       details: Audit.makeTableDetails(headings, items),
     };
   }
diff --git a/lighthouse-core/audits/dobetterweb/uses-http2.js b/lighthouse-core/audits/dobetterweb/uses-http2.js
index 96299d48d..065448884 100644
--- a/lighthouse-core/audits/dobetterweb/uses-http2.js
+++ b/lighthouse-core/audits/dobetterweb/uses-http2.js
@@ -96,11 +96,6 @@ class UsesHTTP2Audit extends Audit {
       return {
         score: Number(resources.length === 0),
         displayValue: displayValue,
-        extendedInfo: {
-          value: {
-            results: resources,
-          },
-        },
         details,
       };
     });
diff --git a/lighthouse-core/audits/dobetterweb/uses-passive-event-listeners.js b/lighthouse-core/audits/dobetterweb/uses-passive-event-listeners.js
index 8545245ff..db83a8b0a 100644
--- a/lighthouse-core/audits/dobetterweb/uses-passive-event-listeners.js
+++ b/lighthouse-core/audits/dobetterweb/uses-passive-event-listeners.js
@@ -58,9 +58,6 @@ class PassiveEventsAudit extends ViolationAudit {
 
     return {
       score: Number(results.length === 0),
-      extendedInfo: {
-        value: results,
-      },
       details,
     };
   }
diff --git a/lighthouse-core/audits/is-on-https.js b/lighthouse-core/audits/is-on-https.js
index e42d33add..20f9dda10 100644
--- a/lighthouse-core/audits/is-on-https.js
+++ b/lighthouse-core/audits/is-on-https.js
@@ -89,9 +89,6 @@ class HTTPS extends Audit {
       return {
         score: Number(items.length === 0),
         displayValue,
-        extendedInfo: {
-          value: items,
-        },
         details: Audit.makeTableDetails(headings, items),
       };
     });
diff --git a/lighthouse-core/audits/legacy-javascript.js b/lighthouse-core/audits/legacy-javascript.js
index 30cb83ca2..fa2241486 100644
--- a/lighthouse-core/audits/legacy-javascript.js
+++ b/lighthouse-core/audits/legacy-javascript.js
@@ -376,6 +376,12 @@ class LegacyJavascript extends Audit {
     ];
     const details = Audit.makeTableDetails(headings, items);
 
+    /** @type {LH.Audit.Details.DebugData} */
+    const debugData = {
+      type: 'debugdata',
+      signalCount,
+    };
+
     // Only fail if first party code has legacy code.
     const mainDocumentEntity = thirdPartyWeb.getEntity(artifacts.URL.finalUrl);
     const foundSignalInFirstPartyCode = items.some(row => {
@@ -384,10 +390,7 @@ class LegacyJavascript extends Audit {
     return {
       score: foundSignalInFirstPartyCode ? 0 : 1,
       notApplicable: !foundSignalInFirstPartyCode,
-      extendedInfo: {
-        signalCount,
-      },
-      details,
+      details: {...details, debugData},
     };
   }
 }
diff --git a/lighthouse-core/audits/metrics/interactive.js b/lighthouse-core/audits/metrics/interactive.js
index ec9858112..b4435b477 100644
--- a/lighthouse-core/audits/metrics/interactive.js
+++ b/lighthouse-core/audits/metrics/interactive.js
@@ -74,14 +74,6 @@ class InteractiveMetric extends Audit {
     const timeInMs = metricResult.timing;
     const isDesktop = artifacts.TestedAsMobileDevice === false;
     const options = isDesktop ? context.options.desktop : context.options.mobile;
-    const extendedInfo = {
-      timeInMs,
-      timestamp: metricResult.timestamp,
-      // @ts-ignore - TODO(bckenny): make lantern metric/metric a discriminated union.
-      optimistic: metricResult.optimisticEstimate && metricResult.optimisticEstimate.timeInMs,
-      // @ts-ignore
-      pessimistic: metricResult.pessimisticEstimate && metricResult.pessimisticEstimate.timeInMs,
-    };
 
     return {
       score: Audit.computeLogNormalScore(
@@ -91,9 +83,6 @@ class InteractiveMetric extends Audit {
       numericValue: timeInMs,
       numericUnit: 'millisecond',
       displayValue: str_(i18n.UIStrings.seconds, {timeInMs}),
-      extendedInfo: {
-        value: extendedInfo,
-      },
     };
   }
 }
diff --git a/lighthouse-core/audits/redirects.js b/lighthouse-core/audits/redirects.js
index fc6f7bb8a..2ca8b8b61 100644
--- a/lighthouse-core/audits/redirects.js
+++ b/lighthouse-core/audits/redirects.js
@@ -113,11 +113,6 @@ class Redirects extends Audit {
       displayValue: totalWastedMs ?
         str_(i18n.UIStrings.displayValueMsSavings, {wastedMs: totalWastedMs}) :
         '',
-      extendedInfo: {
-        value: {
-          wastedMs: totalWastedMs,
-        },
-      },
       details,
     };
   }
diff --git a/lighthouse-core/audits/server-response-time.js b/lighthouse-core/audits/server-response-time.js
index a75ce2306..f2e157f9b 100644
--- a/lighthouse-core/audits/server-response-time.js
+++ b/lighthouse-core/audits/server-response-time.js
@@ -73,11 +73,6 @@ class ServerResponseTime extends Audit {
       score: Number(passed),
       displayValue,
       details,
-      extendedInfo: {
-        value: {
-          wastedMs: responseTime - RESPONSE_THRESHOLD,
-        },
-      },
     };
   }
 }
diff --git a/lighthouse-core/audits/user-timings.js b/lighthouse-core/audits/user-timings.js
index d2ad0361c..974445cb1 100644
--- a/lighthouse-core/audits/user-timings.js
+++ b/lighthouse-core/audits/user-timings.js
@@ -111,9 +111,6 @@ class UserTimings extends Audit {
         score: Number(userTimings.length === 0),
         notApplicable: userTimings.length === 0,
         displayValue,
-        extendedInfo: {
-          value: userTimings,
-        },
         details,
       };
     });
diff --git a/lighthouse-core/audits/uses-rel-preconnect.js b/lighthouse-core/audits/uses-rel-preconnect.js
index 7c288aa90..c5c4eb2d3 100644
--- a/lighthouse-core/audits/uses-rel-preconnect.js
+++ b/lighthouse-core/audits/uses-rel-preconnect.js
@@ -209,9 +209,6 @@ class UsesRelPreconnectAudit extends Audit {
       displayValue: maxWasted ?
         str_(i18n.UIStrings.displayValueMsSavings, {wastedMs: maxWasted}) :
         '',
-      extendedInfo: {
-        value: results,
-      },
       warnings,
       details,
     };
diff --git a/lighthouse-core/audits/uses-rel-preload.js b/lighthouse-core/audits/uses-rel-preload.js
index 8ac4a2d98..8922b80db 100644
--- a/lighthouse-core/audits/uses-rel-preload.js
+++ b/lighthouse-core/audits/uses-rel-preload.js
@@ -243,9 +243,6 @@ class UsesRelPreloadAudit extends Audit {
       displayValue: wastedMs ?
         str_(i18n.UIStrings.displayValueMsSavings, {wastedMs}) :
         '',
-      extendedInfo: {
-        value: results,
-      },
       details,
       warnings,
     };


Test patch:
diff --git a/lighthouse-core/test/audits/byte-efficiency/total-byte-weight-test.js b/lighthouse-core/test/audits/byte-efficiency/total-byte-weight-test.js
index a7901b7bf..acfbb8480 100644
--- a/lighthouse-core/test/audits/byte-efficiency/total-byte-weight-test.js
+++ b/lighthouse-core/test/audits/byte-efficiency/total-byte-weight-test.js
@@ -51,7 +51,6 @@ describe('Total byte weight audit', () => {
       assert.strictEqual(result.score, 1);
       const results = result.details.items;
       assert.strictEqual(results.length, 3);
-      assert.strictEqual(result.extendedInfo.value.totalCompletedRequests, 3);
       assert.strictEqual(results[0].totalBytes, 71680, 'results are sorted');
     });
   });
@@ -76,7 +75,6 @@ describe('Total byte weight audit', () => {
       assert.strictEqual(result.numericValue, 4180 * 1024);
       const results = result.details.items;
       assert.strictEqual(results.length, 10, 'results are clipped at top 10');
-      assert.strictEqual(result.extendedInfo.value.totalCompletedRequests, 11);
     });
   });
 
diff --git a/lighthouse-core/test/audits/byte-efficiency/uses-long-cache-ttl-test.js b/lighthouse-core/test/audits/byte-efficiency/uses-long-cache-ttl-test.js
index 1a9c633d7..15a87f147 100644
--- a/lighthouse-core/test/audits/byte-efficiency/uses-long-cache-ttl-test.js
+++ b/lighthouse-core/test/audits/byte-efficiency/uses-long-cache-ttl-test.js
@@ -44,7 +44,7 @@ describe('Cache headers audit', () => {
     const networkRecords = [networkRecord()];
     const context = {options, computedCache: new Map()};
     return CacheHeadersAudit.audit(getArtifacts(networkRecords), context).then(result => {
-      const items = result.extendedInfo.value.results;
+      const items = result.details.items;
       assert.equal(items.length, 1);
       assert.equal(items[0].cacheLifetimeMs, 0);
       assert.equal(items[0].wastedBytes, 10000);
@@ -104,7 +104,7 @@ describe('Cache headers audit', () => {
 
     const context = {options, computedCache: new Map()};
     return CacheHeadersAudit.audit(getArtifacts(networkRecords), context).then(result => {
-      const items = result.extendedInfo.value.results;
+      const items = result.details.items;
       assert.equal(items.length, 3);
       closeEnough(items[0].cacheLifetimeMs, 3600 * 1000);
       assert.equal(Math.round(items[0].wastedBytes), 8000);
@@ -130,7 +130,7 @@ describe('Cache headers audit', () => {
 
     const context = {options, computedCache: new Map()};
     return CacheHeadersAudit.audit(getArtifacts(networkRecords), context).then(result => {
-      const items = result.extendedInfo.value.results;
+      const items = result.details.items;
       assert.equal(items.length, 2);
       assert.ok(Math.abs(items[0].cacheLifetimeMs - 3600 * 1000) <= 5, 'invalid expires parsing');
       assert.equal(Math.round(items[0].wastedBytes), 8000);
@@ -154,7 +154,7 @@ describe('Cache headers audit', () => {
 
     const context = {options, computedCache: new Map()};
     return CacheHeadersAudit.audit(getArtifacts(networkRecords), context).then(result => {
-      const items = result.extendedInfo.value.results;
+      const items = result.details.items;
       assert.equal(items.length, 1);
     });
   });
@@ -167,7 +167,7 @@ describe('Cache headers audit', () => {
 
     const context = {options, computedCache: new Map()};
     return CacheHeadersAudit.audit(getArtifacts(networkRecords), context).then(result => {
-      const items = result.extendedInfo.value.results;
+      const items = result.details.items;
       assert.equal(items.length, 2);
     });
   });
@@ -183,7 +183,7 @@ describe('Cache headers audit', () => {
 
     const context = {options, computedCache: new Map()};
     return CacheHeadersAudit.audit(getArtifacts(networkRecords), context).then(result => {
-      const items = result.extendedInfo.value.results;
+      const items = result.details.items;
       assert.equal(result.score, 1);
       assert.equal(items.length, 0);
     });
@@ -198,7 +198,7 @@ describe('Cache headers audit', () => {
 
     const context = {options, computedCache: new Map()};
     return CacheHeadersAudit.audit(getArtifacts(networkRecords), context).then(result => {
-      const items = result.extendedInfo.value.results;
+      const items = result.details.items;
       assert.equal(result.score, 1);
       assert.equal(items.length, 0);
     });
@@ -216,9 +216,8 @@ describe('Cache headers audit', () => {
     const context = {options, computedCache: new Map()};
     return CacheHeadersAudit.audit(getArtifacts(networkRecords), context).then(result => {
       assert.equal(result.score, 1);
-      const items = result.extendedInfo.value.results;
+      const items = result.details.items;
       assert.equal(items.length, 1);
-      assert.equal(result.extendedInfo.value.queryStringCount, 1);
     });
   });
 });
diff --git a/lighthouse-core/test/audits/dobetterweb/no-vulnerable-libraries-test.js b/lighthouse-core/test/audits/dobetterweb/no-vulnerable-libraries-test.js
index cbf9fa1c2..6a1b72987 100644
--- a/lighthouse-core/test/audits/dobetterweb/no-vulnerable-libraries-test.js
+++ b/lighthouse-core/test/audits/dobetterweb/no-vulnerable-libraries-test.js
@@ -37,7 +37,6 @@ describe('Avoids front-end JavaScript libraries with known vulnerabilities', ()
     });
     assert.equal(auditResult.score, 0);
     assert.equal(auditResult.details.items.length, 1);
-    assert.equal(auditResult.extendedInfo.jsLibs.length, 3);
     expect(auditResult.details.items[0].highestSeverity).toBeDisplayString('High');
     assert.equal(auditResult.details.items[0].detectedLib.type, 'link');
     assert.equal(auditResult.details.items[0].detectedLib.text, 'angular@1.1.4');
@@ -90,7 +89,6 @@ describe('Avoids front-end JavaScript libraries with known vulnerabilities', ()
     });
     assert.equal(auditResult.score, 1);
     assert.equal(auditResult.details.items.length, 0);
-    assert.equal(auditResult.extendedInfo.jsLibs.length, 2);
   });
 
   it('passes when no JS libraries are detected', () => {
diff --git a/lighthouse-core/test/audits/dobetterweb/password-inputs-can-be-pasted-into-test.js b/lighthouse-core/test/audits/dobetterweb/password-inputs-can-be-pasted-into-test.js
index 404f0f624..37a381bda 100644
--- a/lighthouse-core/test/audits/dobetterweb/password-inputs-can-be-pasted-into-test.js
+++ b/lighthouse-core/test/audits/dobetterweb/password-inputs-can-be-pasted-into-test.js
@@ -17,7 +17,6 @@ describe('Password inputs can be pasted into', () => {
       PasswordInputsWithPreventedPaste: [],
     });
     assert.equal(auditResult.score, 1);
-    assert.equal(auditResult.extendedInfo.value.length, 0);
     assert.equal(auditResult.details.items.length, 0);
   });
 
@@ -26,7 +25,6 @@ describe('Password inputs can be pasted into', () => {
       PasswordInputsWithPreventedPaste: [{snippet: ''}, {snippet: ''}],
     });
     assert.equal(auditResult.score, 0);
-    assert.equal(auditResult.extendedInfo.value.length, 2);
     assert.equal(auditResult.details.items.length, 2);
   });
 });
diff --git a/lighthouse-core/test/audits/dobetterweb/uses-passive-event-listeners-test.js b/lighthouse-core/test/audits/dobetterweb/uses-passive-event-listeners-test.js
index 2b85b1f0c..8381e891e 100644
--- a/lighthouse-core/test/audits/dobetterweb/uses-passive-event-listeners-test.js
+++ b/lighthouse-core/test/audits/dobetterweb/uses-passive-event-listeners-test.js
@@ -25,7 +25,7 @@ describe('Page uses passive events listeners where applicable', () => {
     });
 
     assert.equal(auditResult.score, 0);
-    assert.equal(auditResult.extendedInfo.value.length, 2);
+    assert.equal(auditResult.details.items.length, 2);
   });
 
   it('passes scroll blocking listeners should be passive', () => {
@@ -33,6 +33,6 @@ describe('Page uses passive events listeners where applicable', () => {
       ConsoleMessages: [],
     });
     assert.equal(auditResult.score, 1);
-    assert.equal(auditResult.extendedInfo.value.length, 0);
+    assert.equal(auditResult.details.items.length, 0);
   });
 });
diff --git a/lighthouse-core/test/audits/is-on-https-test.js b/lighthouse-core/test/audits/is-on-https-test.js
index afaee8ccd..5451b5cee 100644
--- a/lighthouse-core/test/audits/is-on-https-test.js
+++ b/lighthouse-core/test/audits/is-on-https-test.js
@@ -29,7 +29,7 @@ describe('Security: HTTPS audit', () => {
     ]), {computedCache: new Map()}).then(result => {
       assert.strictEqual(result.score, 0);
       expect(result.displayValue).toBeDisplayString('2 insecure requests found');
-      assert.strictEqual(result.extendedInfo.value.length, 2);
+      assert.strictEqual(result.details.items.length, 2);
     });
   });
 
@@ -41,7 +41,7 @@ describe('Security: HTTPS audit', () => {
     ]), {computedCache: new Map()}).then(result => {
       assert.strictEqual(result.score, 0);
       expect(result.displayValue).toBeDisplayString('1 insecure request found');
-      assert.deepEqual(result.extendedInfo.value[0], {url: 'http://insecure.com/image.jpeg'});
+      assert.deepEqual(result.details.items[0], {url: 'http://insecure.com/image.jpeg'});
     });
   });
 
diff --git a/lighthouse-core/test/audits/legacy-javascript-test.js b/lighthouse-core/test/audits/legacy-javascript-test.js
index 57c7897bd..6af8c5baf 100644
--- a/lighthouse-core/test/audits/legacy-javascript-test.js
+++ b/lighthouse-core/test/audits/legacy-javascript-test.js
@@ -80,7 +80,7 @@ describe('LegacyJavaScript audit', () => {
     ]);
     const result = await LegacyJavascript.audit(artifacts, {computedCache: new Map()});
     assert.equal(result.score, 1);
-    assert.equal(result.extendedInfo.signalCount, 0);
+    assert.equal(result.details.debugData.signalCount, 0);
   });
 
   it('passes code with a legacy polyfill in third party resource', async () => {
@@ -92,7 +92,7 @@ describe('LegacyJavaScript audit', () => {
     ]);
     const result = await LegacyJavascript.audit(artifacts, {computedCache: new Map()});
     assert.equal(result.score, 1);
-    assert.equal(result.extendedInfo.signalCount, 1);
+    assert.equal(result.details.debugData.signalCount, 1);
   });
 
   it('fails code with a legacy polyfill', async () => {
@@ -104,7 +104,7 @@ describe('LegacyJavaScript audit', () => {
     ]);
     const result = await LegacyJavascript.audit(artifacts, {computedCache: new Map()});
     assert.equal(result.score, 0);
-    assert.equal(result.extendedInfo.signalCount, 1);
+    assert.equal(result.details.debugData.signalCount, 1);
     expect(result.details.items[0].subItems.items[0].signal).toEqual('String.prototype.repeat');
   });
 
@@ -117,7 +117,7 @@ describe('LegacyJavaScript audit', () => {
     ]);
     const result = await LegacyJavascript.audit(artifacts, {computedCache: new Map()});
     assert.equal(result.score, 0);
-    assert.equal(result.extendedInfo.signalCount, 2);
+    assert.equal(result.details.debugData.signalCount, 2);
   });
 
   it('counts multiple of the same polyfill from the same script only once', async () => {
@@ -134,7 +134,7 @@ describe('LegacyJavaScript audit', () => {
     ]);
     const result = await LegacyJavascript.audit(artifacts, {computedCache: new Map()});
     assert.equal(result.score, 0);
-    assert.equal(result.extendedInfo.signalCount, 1);
+    assert.equal(result.details.debugData.signalCount, 1);
   });
 
   it('should identify polyfills in multiple patterns', async () => {
diff --git a/lighthouse-core/test/audits/user-timing-test.js b/lighthouse-core/test/audits/user-timing-test.js
index d12ee5a68..1cb3e9cb0 100644
--- a/lighthouse-core/test/audits/user-timing-test.js
+++ b/lighthouse-core/test/audits/user-timing-test.js
@@ -22,7 +22,7 @@ describe('Performance: user-timings audit', () => {
   it('evaluates valid input correctly', () => {
     const artifacts = generateArtifactsWithTrace(traceEvents);
     return UserTimingsAudit.audit(artifacts, {computedCache: new Map()}).then(auditResult => {
-      const excludedUTs = auditResult.extendedInfo.value.filter(timing => {
+      const excludedUTs = auditResult.details.items.filter(timing => {
         return UserTimingsAudit.excludedPrefixes.some(prefix => timing.name.startsWith(prefix));
       });
       assert.equal(excludedUTs.length, 0, 'excluded usertimings included in results');
@@ -61,7 +61,7 @@ describe('Performance: user-timings audit', () => {
 
     const artifacts = generateArtifactsWithTrace(extraTraceEvents);
     return UserTimingsAudit.audit(artifacts, {computedCache: new Map()}).then(result => {
-      const fakeEvt = result.extendedInfo.value.find(item => item.name === 'Zone:ZonePromise');
+      const fakeEvt = result.details.items.find(item => item.name === 'Zone:ZonePromise');
       assert.ok(fakeEvt, 'failed to find user timing item with colon');
     });
   });
diff --git a/lighthouse-core/test/audits/uses-rel-preconnect-test.js b/lighthouse-core/test/audits/uses-rel-preconnect-test.js
index 2b12cc59a..89288772e 100644
--- a/lighthouse-core/test/audits/uses-rel-preconnect-test.js
+++ b/lighthouse-core/test/audits/uses-rel-preconnect-test.js
@@ -201,10 +201,10 @@ describe('Performance: uses-rel-preconnect audit', () => {
     };
 
     const context = {settings: {}, computedCache: new Map()};
-    const {numericValue, extendedInfo} = await UsesRelPreconnect.audit(artifacts, context);
+    const {numericValue, details} = await UsesRelPreconnect.audit(artifacts, context);
     assert.equal(numericValue, 300);
-    assert.equal(extendedInfo.value.length, 1);
-    assert.deepStrictEqual(extendedInfo.value, [
+    assert.equal(details.items.length, 1);
+    assert.deepStrictEqual(details.items, [
       {url: 'https://cdn.example.com', wastedMs: 300},
     ]);
   });
@@ -244,12 +244,12 @@ describe('Performance: uses-rel-preconnect audit', () => {
     const context = {settings: {}, computedCache: new Map()};
     const {
       numericValue,
-      extendedInfo,
+      details,
       warnings,
     } = await UsesRelPreconnect.audit(artifacts, context);
     assert.equal(numericValue, 300);
-    assert.equal(extendedInfo.value.length, 2);
-    assert.deepStrictEqual(extendedInfo.value, [
+    assert.equal(details.items.length, 2);
+    assert.deepStrictEqual(details.items, [
       {url: 'https://othercdn.example.com', wastedMs: 300},
       {url: 'http://cdn.example.com', wastedMs: 150},
     ]);
diff --git a/lighthouse-core/test/scoring-test.js b/lighthouse-core/test/scoring-test.js
index fa5591c99..edd95c8ab 100644
--- a/lighthouse-core/test/scoring-test.js
+++ b/lighthouse-core/test/scoring-test.js
@@ -36,7 +36,7 @@ describe('ReportScoring', () => {
     it('should score the categories', () => {
       const resultsByAuditId = {
         'my-audit': {score: 0},
-        'my-boolean-audit': {score: 1, extendedInfo: {}},
+        'my-boolean-audit': {score: 1},
         'my-scored-audit': {score: 1},
         'my-failed-audit': {score: 0.2},
         'my-boolean-failed-audit': {score: 0},
@@ -64,7 +64,7 @@ describe('ReportScoring', () => {
 
     it('should weight notApplicable audits as 0', () => {
       const resultsByAuditId = {
-        'my-boolean-audit': {score: 1, extendedInfo: {}, scoreDisplayMode: 'notApplicable'},
+        'my-boolean-audit': {score: 1, scoreDisplayMode: 'notApplicable'},
         'my-scored-audit': {score: 1},
         'my-failed-audit': {score: 0.2, scoreDisplayMode: 'notApplicable'},
         'my-boolean-failed-audit': {score: 0},