blob: 62581c6374d33c1b2e21fd559d88a6e5e755cc9a [file] [log] [blame]
Patrick Hulcea087f622018-05-18 00:37:53 +00001// Copyright 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5/**
6 * @override
7 */
8Audits2.ReportRenderer = class extends ReportRenderer {
9 /**
Paul Irish8f1e33d2018-05-31 02:29:50 +000010 * @param {!Element} el Parent element to render the report into.
11 * @param {!ReportRenderer.RunnerResultArtifacts=} artifacts
Patrick Hulcea087f622018-05-18 00:37:53 +000012 */
Paul Irish8f1e33d2018-05-31 02:29:50 +000013 static addViewTraceButton(el, artifacts) {
14 if (!artifacts || !artifacts.traces || !artifacts.traces.defaultPass)
15 return;
Patrick Hulcea087f622018-05-18 00:37:53 +000016
Paul Irish8f1e33d2018-05-31 02:29:50 +000017 const defaultPassTrace = artifacts.traces.defaultPass;
18 const timelineButton = UI.createTextButton(Common.UIString('View Trace'), onViewTraceClick, 'view-trace');
19 el.querySelector('.lh-metric-column').appendChild(timelineButton);
20 return el;
21
22 async function onViewTraceClick() {
23 await UI.inspectorView.showPanel('timeline');
24 Timeline.TimelinePanel.instance().loadFromEvents(defaultPassTrace.traceEvents);
25 }
Patrick Hulcea087f622018-05-18 00:37:53 +000026 }
27};
28
29class ReportUIFeatures {
30 /**
31 * @param {!ReportRenderer.ReportJSON} report
32 */
33 initFeatures(report) {
34 }
35}
36
Patrick Hulcea087f622018-05-18 00:37:53 +000037
38Audits2.DetailsRenderer = class extends DetailsRenderer {
39 /**
40 * @param {!DOM} dom
41 */
42 constructor(dom) {
43 super(dom);
44 this._onLoadPromise = null;
45 }
46
47 /**
48 * @override
49 * @param {!DetailsRenderer.NodeDetailsJSON} item
50 * @return {!Element}
51 */
52 renderNode(item) {
53 const element = super.renderNode(item);
54 this._replaceWithDeferredNodeBlock(element, item);
55 return element;
56 }
57
58 /**
59 * @param {!Element} origElement
60 * @param {!DetailsRenderer.NodeDetailsJSON} detailsItem
61 */
62 async _replaceWithDeferredNodeBlock(origElement, detailsItem) {
63 const mainTarget = SDK.targetManager.mainTarget();
64 if (!this._onLoadPromise) {
65 const resourceTreeModel = mainTarget.model(SDK.ResourceTreeModel);
66 this._onLoadPromise = resourceTreeModel.once(SDK.ResourceTreeModel.Events.Load);
67 }
68
69 await this._onLoadPromise;
70
71 const domModel = mainTarget.model(SDK.DOMModel);
72 if (!detailsItem.path)
73 return;
74
75 const nodeId = await domModel.pushNodeByPathToFrontend(detailsItem.path);
76
77 if (!nodeId)
78 return;
79 const node = domModel.nodeForId(nodeId);
80 if (!node)
81 return;
82
83 const element =
84 await Common.Linkifier.linkify(node, /** @type {!Common.Linkifier.Options} */ ({title: detailsItem.snippet}));
85 origElement.title = '';
86 origElement.textContent = '';
87 origElement.appendChild(element);
88 }
89};