Web Inspector: refactor WI.TimelineDataGridNode and its subclasses to unify the API...
[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 "element":
62             return value ? WI.linkifyNodeReference(value) : emDash;
63
64         case "time": {
65             const higherResolution = true;
66             return Number.secondsToString(value, higherResolution);
67         }
68
69         case "originator":
70             return value ? WI.linkifyNodeReference(value) : zeroWidthSpace;
71         }
72
73         return super.createCellContent(columnIdentifier, cell);
74     }
75
76     iconClassNames()
77     {
78         let iconClassNames = super.iconClassNames();
79         if (this.record.eventType === WI.MediaTimelineRecord.EventType.DOMEvent && this.record.domEvent.eventName === "webkitfullscreenchange")
80             iconClassNames.push("fullscreen");
81         return iconClassNames;
82     }
83
84     // Protected
85
86     filterableDataForColumn(columnIdentifier)
87     {
88         if (columnIdentifier === "element") {
89             if (this.record.domNode)
90                 return this.record.domNode.displayName;
91         }
92
93         if (columnIdentifier === "originator") {
94             if (this.record.eventType === WI.MediaTimelineRecord.EventType.DOMEvent && this.record.domEvent.originator)
95                 return this.record.domEvent.originator.displayName;
96         }
97
98         return super.filterableDataForColumn(columnIdentifier);
99     }
100 };