Web Inspector: Timelines: flatten the overview to show all records, one per line
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Views / MediaTimelineDataGridNode.js
1 /*
2  * Copyright (C) 2018 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 WI.MediaTimelineDataGridNode = class MediaTimelineDataGridNode extends WI.TimelineDataGridNode
27 {
28     constructor(record, options = {})
29     {
30         console.assert(record instanceof WI.MediaTimelineRecord);
31
32         super([record], options);
33     }
34
35     // Public
36
37     get data()
38     {
39         if (this._cachedData)
40             return this._cachedData;
41
42         this._cachedData = super.data;
43         this._cachedData.name = this.record.displayName;
44         if (this.record.domNode)
45             this._cachedData.element = this.record.domNode;
46         this._cachedData.time = this.record.startTime - (this.graphDataSource ? this.graphDataSource.zeroTime : 0);
47         if (this.record.eventType === WI.MediaTimelineRecord.EventType.DOMEvent && this.record.domEvent.originator)
48             this._cachedData.originator = this.record.domEvent.originator;
49         return this._cachedData;
50     }
51
52     createCellContent(columnIdentifier, cell)
53     {
54         let value = this.data[columnIdentifier];
55
56         switch (columnIdentifier) {
57         case "name":
58             cell.classList.add(...this.iconClassNames());
59             return value;
60
61         case "source": // Timeline Overview
62         case "element":
63             return value ? WI.linkifyNodeReference(value) : emDash;
64
65         case "time": {
66             const higherResolution = true;
67             return Number.secondsToString(value, higherResolution);
68         }
69
70         case "originator":
71             return value ? WI.linkifyNodeReference(value) : zeroWidthSpace;
72         }
73
74         return super.createCellContent(columnIdentifier, cell);
75     }
76
77     iconClassNames()
78     {
79         let iconClassNames = super.iconClassNames();
80         if (this.record.eventType === WI.MediaTimelineRecord.EventType.DOMEvent && this.record.domEvent.eventName === "webkitfullscreenchange")
81             iconClassNames.push("fullscreen");
82         return iconClassNames;
83     }
84
85     // Protected
86
87     filterableDataForColumn(columnIdentifier)
88     {
89         if (columnIdentifier === "element") {
90             if (this.record.domNode)
91                 return this.record.domNode.displayName;
92         }
93
94         if (columnIdentifier === "originator") {
95             if (this.record.eventType === WI.MediaTimelineRecord.EventType.DOMEvent && this.record.domEvent.originator)
96                 return this.record.domEvent.originator.displayName;
97         }
98
99         return super.filterableDataForColumn(columnIdentifier);
100     }
101 };