Web Inspector: Timelines: add Media timeline
[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, graphDataSource)
29     {
30         console.assert(record instanceof WI.MediaTimelineRecord);
31
32         const includesGraph = false;
33         super(includesGraph, graphDataSource);
34
35         this._records = [record];
36     }
37
38     // Public
39
40     get records() { return this._records; }
41
42     get data()
43     {
44         if (this._cachedData)
45             return this._cachedData;
46
47         this._cachedData = super.data;
48         this._cachedData.name = this.record.displayName;
49         if (this.record.domNode)
50             this._cachedData.element = this.record.domNode;
51         this._cachedData.time = this.record.startTime - (this.graphDataSource ? this.graphDataSource.zeroTime : 0);
52         if (this.record.eventType === WI.MediaTimelineRecord.EventType.DOMEvent && this.record.domEvent.originator)
53             this._cachedData.originator = this.record.domEvent.originator;
54         return this._cachedData;
55     }
56
57     createCellContent(columnIdentifier, cell)
58     {
59         let value = this.data[columnIdentifier];
60
61         switch (columnIdentifier) {
62         case "name":
63             cell.classList.add(...this.iconClassNames());
64             return value;
65
66         case "element":
67             return value ? WI.linkifyNodeReference(value) : emDash;
68
69         case "time": {
70             const higherResolution = true;
71             return Number.secondsToString(value, higherResolution);
72         }
73
74         case "originator":
75             return value ? WI.linkifyNodeReference(value) : zeroWidthSpace;
76         }
77
78         return super.createCellContent(columnIdentifier, cell);
79     }
80
81     iconClassNames()
82     {
83         let iconClassNames = super.iconClassNames();
84         if (this.record.eventType === WI.MediaTimelineRecord.EventType.DOMEvent && this.record.domEvent.eventName === "webkitfullscreenchange")
85             iconClassNames.push("fullscreen");
86         return iconClassNames;
87     }
88
89     // Protected
90
91     filterableDataForColumn(columnIdentifier)
92     {
93         if (columnIdentifier === "element") {
94             if (this.record.domNode)
95                 return this.record.domNode.displayName;
96         }
97
98         if (columnIdentifier === "originator") {
99             if (this.record.eventType === WI.MediaTimelineRecord.EventType.DOMEvent && this.record.domEvent.originator)
100                 return this.record.domEvent.originator.displayName;
101         }
102
103         return super.filterableDataForColumn(columnIdentifier);
104     }
105 };