2222 * Dummy text for ensuring report robustness: </script> pre$`post %%LIGHTHOUSE_JSON%%
2323 */
2424
25- /* globals DOM, DetailsRenderer */
25+ /* globals self */
2626
2727const RATINGS = {
2828 PASS : { label : 'pass' , minScore : 75 } ,
@@ -56,15 +56,18 @@ function formatNumber(number) {
5656
5757class ReportRenderer {
5858 /**
59- * @param {!Document } document
59+ * @param {!DOM } dom
60+ * @param {!DetailsRenderer } detailsRenderer
6061 */
61- constructor ( document ) {
62- this . _dom = new DOM ( document ) ;
63- this . _detailsRenderer = new DetailsRenderer ( this . _dom ) ;
62+ constructor ( dom , detailsRenderer ) {
63+ this . _dom = dom ;
64+ this . _detailsRenderer = detailsRenderer ;
65+
66+ this . _templateContext = this . _dom . document ( ) ;
6467 }
6568
6669 /**
67- * @param {!ReportJSON } report
70+ * @param {!ReportRenderer. ReportJSON } report
6871 * @return {!Element }
6972 */
7073 renderReport ( report ) {
@@ -94,15 +97,24 @@ class ReportRenderer {
9497 element . querySelector ( '.lh-score__description' )
9598 . appendChild ( this . _dom . createSpanFromMarkdown ( description ) ) ;
9699
97- return element ;
100+ return /** @type {!Element } **/ ( element ) ;
101+ }
102+
103+ /**
104+ * Define a custom element for <templates> to be extracted from. For example:
105+ * this.setTemplateContext(new DOMParser().parseFromString(htmlStr, 'text/html'))
106+ * @param {!Document|!Element } context
107+ */
108+ setTemplateContext ( context ) {
109+ this . _templateContext = context ;
98110 }
99111
100112 /**
101- * @param {!AuditJSON } audit
113+ * @param {!ReportRenderer. AuditJSON } audit
102114 * @return {!Element }
103115 */
104116 _renderAuditScore ( audit ) {
105- const tmpl = this . _dom . cloneTemplate ( '#tmpl-lh-audit-score' ) ;
117+ const tmpl = this . _dom . cloneTemplate ( '#tmpl-lh-audit-score' , this . _templateContext ) ;
106118
107119 const scoringMode = audit . result . scoringMode ;
108120 const description = audit . result . helpText ;
@@ -126,11 +138,11 @@ class ReportRenderer {
126138 }
127139
128140 /**
129- * @param {!CategoryJSON } category
141+ * @param {!ReportRenderer. CategoryJSON } category
130142 * @return {!Element }
131143 */
132144 _renderCategoryScore ( category ) {
133- const tmpl = this . _dom . cloneTemplate ( '#tmpl-lh-category-score' ) ;
145+ const tmpl = this . _dom . cloneTemplate ( '#tmpl-lh-category-score' , this . _templateContext ) ;
134146 const score = Math . round ( category . score ) ;
135147 return this . _populateScore ( tmpl , score , 'numeric' , category . name , category . description ) ;
136148 }
@@ -146,7 +158,7 @@ class ReportRenderer {
146158 }
147159
148160 /**
149- * @param {!ReportJSON } report
161+ * @param {!ReportRenderer. ReportJSON } report
150162 * @return {!Element }
151163 */
152164 _renderReport ( report ) {
@@ -158,7 +170,7 @@ class ReportRenderer {
158170 }
159171
160172 /**
161- * @param {!CategoryJSON } category
173+ * @param {!ReportRenderer. CategoryJSON } category
162174 * @return {!Element }
163175 */
164176 _renderCategory ( category ) {
@@ -185,7 +197,7 @@ class ReportRenderer {
185197 }
186198
187199 /**
188- * @param {!AuditJSON } audit
200+ * @param {!ReportRenderer. AuditJSON } audit
189201 * @return {!Element }
190202 */
191203 _renderAudit ( audit ) {
@@ -197,13 +209,45 @@ class ReportRenderer {
197209
198210if ( typeof module !== 'undefined' && module . exports ) {
199211 module . exports = ReportRenderer ;
212+ } else {
213+ self . ReportRenderer = ReportRenderer ;
200214}
201215
202- /** @typedef {{id: string, weight: number, score: number, result: {description: string, displayValue: string, helpText: string, score: number|boolean, details: DetailsRenderer.DetailsJSON|DetailsRenderer.CardsDetailsJSON|undefined}} } */
203- let AuditJSON ; // eslint-disable-line no-unused-vars
216+ /**
217+ * @typedef {{
218+ * id: string, weight:
219+ * number, score: number,
220+ * result: {
221+ * description: string,
222+ * displayValue: string,
223+ * helpText: string,
224+ * score: (number|boolean),
225+ * scoringMode: string,
226+ * details: (!DetailsRenderer.DetailsJSON|!DetailsRenderer.CardsDetailsJSON|undefined)
227+ * }
228+ * }}
229+ */
230+ ReportRenderer . AuditJSON ; // eslint-disable-line no-unused-expressions
204231
205- /** @typedef {{name: string, weight: number, score: number, description: string, audits: Array<AuditJSON>} } */
206- let CategoryJSON ; // eslint-disable-line no-unused-vars
232+ /**
233+ * @typedef {{
234+ * name: string,
235+ * weight: number,
236+ * score: number,
237+ * description: string,
238+ * audits: !Array<!ReportRenderer.AuditJSON>
239+ * }}
240+ */
241+ ReportRenderer . CategoryJSON ; // eslint-disable-line no-unused-expressions
207242
208- /** @typedef {{reportCategories: Array<CategoryJSON>} } */
209- let ReportJSON ; // eslint-disable-line no-unused-vars
243+ /**
244+ * @typedef {{
245+ * lighthouseVersion: !string,
246+ * generatedTime: !string,
247+ * initialUrl: !string,
248+ * url: !string,
249+ * audits: ?Object,
250+ * reportCategories: !Array<!ReportRenderer.CategoryJSON>
251+ * }}
252+ */
253+ ReportRenderer . ReportJSON ; // eslint-disable-line no-unused-expressions
0 commit comments