diff --git a/lighthouse-cli/test/smokehouse/test-definitions/pwa/pwa2-expectations.js b/lighthouse-cli/test/smokehouse/test-definitions/pwa/pwa2-expectations.js index d5ec678ade65..d250ae839599 100644 --- a/lighthouse-cli/test/smokehouse/test-definitions/pwa/pwa2-expectations.js +++ b/lighthouse-cli/test/smokehouse/test-definitions/pwa/pwa2-expectations.js @@ -116,7 +116,7 @@ module.exports = [ }, 'installable-manifest': { score: 1, - details: {items: [pwaDetailsExpectations]}, + details: {items: [{...pwaDetailsExpectations, manifestUrl: 'https://caltrainschedule.io/manifest.json'}]}, }, 'splash-screen': { score: 1, diff --git a/lighthouse-core/audits/installable-manifest.js b/lighthouse-core/audits/installable-manifest.js index 4f2d87813519..84bed02d579f 100644 --- a/lighthouse-core/audits/installable-manifest.js +++ b/lighthouse-core/audits/installable-manifest.js @@ -89,17 +89,20 @@ class InstallableManifest extends MultiCheckAudit { /** * @param {LH.Artifacts} artifacts * @param {LH.Audit.Context} context - * @return {Promise<{failures: Array, manifestValues: LH.Artifacts.ManifestValues}>} + * @return {Promise<{failures: Array, manifestValues: LH.Artifacts.ManifestValues, manifestUrl: string | null}>} */ static async audit_(artifacts, context) { const manifestValues = await ManifestValues.request(artifacts, context); const manifestFailures = InstallableManifest.assessManifest(manifestValues); + const manifestUrl = artifacts.WebAppManifest ? artifacts.WebAppManifest.url : null; + return { failures: [ ...manifestFailures, ], manifestValues, + manifestUrl, }; } } diff --git a/lighthouse-core/lib/manifest-parser.js b/lighthouse-core/lib/manifest-parser.js index df3620b64ea8..01f1cba9e08d 100644 --- a/lighthouse-core/lib/manifest-parser.js +++ b/lighthouse-core/lib/manifest-parser.js @@ -472,6 +472,7 @@ function parse(string, manifestUrl, documentUrl) { raw: string, value: undefined, warning: 'ERROR: file isn\'t valid JSON: ' + e, + url: manifestUrl, }; } @@ -505,6 +506,7 @@ function parse(string, manifestUrl, documentUrl) { raw: string, value: manifest, warning: manifestUrlWarning, + url: manifestUrl, }; } diff --git a/lighthouse-core/test/audits/installable-manifest-test.js b/lighthouse-core/test/audits/installable-manifest-test.js index f4ea6a84a306..501bb986dc66 100644 --- a/lighthouse-core/test/audits/installable-manifest-test.js +++ b/lighthouse-core/test/audits/installable-manifest-test.js @@ -44,6 +44,16 @@ describe('PWA: webapp install banner audit', () => { }); }); + it('passes when manifest url matches', () => { + const artifacts = generateMockArtifacts(); + const context = generateMockAuditContext(); + + return InstallableManifestAudit.audit(artifacts, context).then(result => { + assert.strictEqual(artifacts.WebAppManifest.url, EXAMPLE_MANIFEST_URL); + assert.strictEqual(result.details.items[0].manifestUrl, EXAMPLE_MANIFEST_URL); + }); + }); + it('fails with a non-parsable manifest', () => { const artifacts = generateMockArtifacts('{,:}'); const context = generateMockAuditContext(); diff --git a/lighthouse-core/test/gather/gather-runner-test.js b/lighthouse-core/test/gather/gather-runner-test.js index 0120527eebd2..498a86bd0584 100644 --- a/lighthouse-core/test/gather/gather-runner-test.js +++ b/lighthouse-core/test/gather/gather-runner-test.js @@ -1803,6 +1803,7 @@ describe('GatherRunner', function() { name: {value: 'App', raw: 'App'}, start_url: {value: passContext.url, raw: undefined}, }); + expect(result && result.url).toMatch(MANIFEST_URL); }); }); }); diff --git a/lighthouse-core/test/results/sample_v2.json b/lighthouse-core/test/results/sample_v2.json index 9dbfae8428e0..ea014b309db6 100644 --- a/lighthouse-core/test/results/sample_v2.json +++ b/lighthouse-core/test/results/sample_v2.json @@ -509,6 +509,7 @@ "failures": [ "No manifest was fetched" ], + "manifestUrl": null, "isParseFailure": true, "parseFailureReason": "No manifest was fetched" }