Web Inspector: Layer summary should be bottom sticky
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Views / ProbeDetailsSidebarPanel.js
1 /*
2  * Copyright (C) 2013 University of Washington. All rights reserved.
3  * Copyright (C) 2014 Apple Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
15  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
16  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
17  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 WebInspector.ProbeDetailsSidebarPanel = function()
28 {
29     WebInspector.DetailsSidebarPanel.call(this, "probe", WebInspector.UIString("Probes"), WebInspector.UIString("Probes"), "Images/NavigationItemProbes.pdf", "6");
30
31     WebInspector.probeManager.addEventListener(WebInspector.ProbeManager.Event.ProbeSetAdded, this._probeSetAdded, this);
32     WebInspector.probeManager.addEventListener(WebInspector.ProbeManager.Event.ProbeSetRemoved, this._probeSetRemoved, this);
33
34     this._probeSetSections = new Map;
35     this._inspectedProbeSets = [];
36
37     // Initialize sidebar sections for probe sets that already exist.
38     for (var probeSet of WebInspector.probeManager.probeSets)
39         this._probeSetAdded(probeSet);
40 };
41
42 WebInspector.ProbeDetailsSidebarPanel.OffsetSectionsStyleClassName  = "offset-sections";
43
44 WebInspector.ProbeDetailsSidebarPanel.prototype = {
45     constructor: WebInspector.ProbeDetailsSidebarPanel,
46     __proto__: WebInspector.DetailsSidebarPanel.prototype,
47
48     // Public
49
50     get inspectedProbeSets()
51     {
52         return this._inspectedProbeSets.slice();
53     },
54
55     set inspectedProbeSets(newProbeSets)
56     {
57         for (var probeSet of this._inspectedProbeSets) {
58             var removedSection = this._probeSetSections.get(probeSet);
59             this.contentElement.removeChild(removedSection.element);
60         }
61
62         this._inspectedProbeSets = newProbeSets;
63
64         for (var probeSet of newProbeSets) {
65             var shownSection = this._probeSetSections.get(probeSet);
66             this.contentElement.appendChild(shownSection.element);
67         }
68     },
69
70     inspect: function(objects)
71     {
72         if (!(objects instanceof Array))
73             objects = [objects];
74
75         var inspectedProbeSets = objects.filter(function(object) {
76             return object instanceof WebInspector.ProbeSet;
77         });
78
79         inspectedProbeSets.sort(function sortBySourceLocation(aProbeSet, bProbeSet) {
80             var aLocation = aProbeSet.breakpoint.sourceCodeLocation;
81             var bLocation = bProbeSet.breakpoint.sourceCodeLocation;
82             var comparisonResult = aLocation.sourceCode.displayName.localeCompare(bLocation.sourceCode.displayName);
83             if (comparisonResult !== 0)
84                 return comparisonResult;
85
86             comparisonResult = aLocation.displayLineNumber - bLocation.displayLineNumber;
87             if (comparisonResult !== 0)
88                 return comparisonResult;
89
90             return aLocation.displayColumnNumber - bLocation.displayColumnNumber;
91         });
92
93         this.inspectedProbeSets = inspectedProbeSets;
94
95         return !!this._inspectedProbeSets.length;
96     },
97
98     // Private
99
100     _probeSetAdded: function(probeSetOrEvent)
101     {
102         var probeSet;
103         if (probeSetOrEvent instanceof WebInspector.ProbeSet)
104             probeSet = probeSetOrEvent;
105         else
106             probeSet = probeSetOrEvent.data.probeSet;
107         console.assert(!this._probeSetSections.has(probeSet), "New probe group ", probeSet, " already has its own sidebar.");
108
109         var newSection = new WebInspector.ProbeSetDetailsSection(probeSet);
110         this._probeSetSections.set(probeSet, newSection);
111     },
112
113
114     _probeSetRemoved: function(event)
115     {
116         var probeSet = event.data.probeSet;
117         console.assert(this._probeSetSections.has(probeSet), "Removed probe group ", probeSet, " doesn't have a sidebar.");
118
119         // First remove probe set from inspected list, then from mapping.
120         var inspectedProbeSets = this.inspectedProbeSets;
121         var index = inspectedProbeSets.indexOf(probeSet);
122         if (index !== -1) {
123             inspectedProbeSets.splice(index, 1);
124             this.inspectedProbeSets = inspectedProbeSets;
125         }
126         var removedSection = this._probeSetSections.get(probeSet);
127         this._probeSetSections.delete(probeSet);
128         removedSection.closed();
129     }
130 };