-
Notifications
You must be signed in to change notification settings - Fork 9.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
report: add method to get the final screenshot #5673
Changes from 7 commits
8c8c82c
52a14fe
d9a614e
5d80a88
d778f8b
5d175b7
6c5a5a6
05910ce
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
/** | ||
* @license Copyright 2018 Google Inc. All Rights Reserved. | ||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 | ||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. | ||
*/ | ||
'use strict'; | ||
|
||
const Audit = require('./audit'); | ||
const LHError = require('../lib/errors'); | ||
|
||
class FinalScreenshot extends Audit { | ||
/** | ||
* @return {LH.Audit.Meta} | ||
*/ | ||
static get meta() { | ||
return { | ||
id: 'final-screenshot', | ||
scoreDisplayMode: Audit.SCORING_MODES.INFORMATIVE, | ||
title: 'Final Screenshot', | ||
description: 'The last screenshot captured of the pageload.', | ||
requiredArtifacts: ['traces'], | ||
}; | ||
} | ||
|
||
/** | ||
* @param {LH.Artifacts} artifacts | ||
* @return {Promise<LH.Audit.Product>} | ||
*/ | ||
static async audit(artifacts) { | ||
const trace = artifacts.traces[Audit.DEFAULT_PASS]; | ||
const screenshots = await artifacts.requestScreenshots(trace); | ||
const finalScreenshot = screenshots[screenshots.length - 1]; | ||
|
||
if (!finalScreenshot) { | ||
throw new LHError(LHError.errors.NO_SCREENSHOTS); | ||
} | ||
|
||
return { | ||
rawValue: true, | ||
details: { | ||
type: 'screenshot', | ||
timestamp: finalScreenshot.timestamp, | ||
data: finalScreenshot.datauri, | ||
}, | ||
}; | ||
} | ||
} | ||
|
||
module.exports = FinalScreenshot; |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -172,7 +172,6 @@ async function prepareAssets(artifacts, audits) { | |
const Runner = require('../runner.js'); | ||
const computedArtifacts = Runner.instantiateComputedArtifacts(); | ||
/** @type {Array<Screenshot>} */ | ||
// @ts-ignore TODO(bckenny): need typed computed artifacts | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👍 |
||
const screenshots = await computedArtifacts.requestScreenshots(trace); | ||
|
||
const traceData = Object.assign({}, trace); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
/** | ||
* @license Copyright 2018 Google Inc. All Rights Reserved. | ||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 | ||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. | ||
*/ | ||
'use strict'; | ||
|
||
const assert = require('assert'); | ||
|
||
const Runner = require('../../runner.js'); | ||
const FinalScreenshotAudit = require('../../audits/final-screenshot'); | ||
const pwaTrace = require('../fixtures/traces/progressive-app-m60.json'); | ||
|
||
/* eslint-env jest */ | ||
|
||
describe('Final screenshot', () => { | ||
let computedArtifacts; | ||
|
||
beforeAll(() => { | ||
computedArtifacts = Runner.instantiateComputedArtifacts(); | ||
}); | ||
|
||
it('should extract a final screenshot from a trace', async () => { | ||
const artifacts = Object.assign({ | ||
traces: {defaultPass: pwaTrace}, | ||
}, computedArtifacts); | ||
const results = await FinalScreenshotAudit.audit(artifacts); | ||
|
||
assert.ok(results.rawValue); | ||
assert.equal(results.details.timestamp, 225414990.064); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
}); | ||
|
||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,6 +7,10 @@ | |
|
||
const assert = require('assert'); | ||
const Util = require('../../../../report/html/renderer/util.js'); | ||
|
||
const ReportRenderer = require('../../../../report/html/renderer/report-renderer.js'); | ||
const sampleResults = require('../../../results/sample_v2.json'); | ||
|
||
const NBSP = '\xa0'; | ||
|
||
/* eslint-env jest */ | ||
|
@@ -142,4 +146,23 @@ describe('util helpers', () => { | |
Util.formatDisplayValue(displayValue); | ||
assert.deepStrictEqual(displayValue, cloned, 'displayValue was mutated'); | ||
}); | ||
|
||
describe('getFinalScreenshot', () => { | ||
sampleResults.reportCategories = Object.values(sampleResults.categories); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. should stringify/parse this to not mutate the module |
||
const category = sampleResults.reportCategories.find(cat => cat.id === 'performance'); | ||
ReportRenderer.smooshAuditResultsIntoCategories(sampleResults.audits, | ||
sampleResults.reportCategories); | ||
|
||
it('gets a datauri as a string', () => { | ||
const datauri = Util.getFinalScreenshot(category); | ||
assert.equal(typeof datauri, 'string'); | ||
assert.ok(datauri.startsWith('data:image/jpeg;base64,')); | ||
}); | ||
|
||
it('returns null if there are no screenshots', () => { | ||
const fakeCategory = Object.assign({}, category, {auditRefs: []}); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can you pass in the |
||
const datauri = Util.getFinalScreenshot(fakeCategory); | ||
assert.equal(datauri, null); | ||
}); | ||
}); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it looks like this is type
filmstrip
. If we're going to make a new type that's screenshot (singular), probably no reason to useitems
, could flatten and do