Web Inspector: Remove Reload and Download Web Archive buttons from FrameTreeElement
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Views / ResourceTreeElement.js
1 /*
2  * Copyright (C) 2013, 2015 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 WebInspector.ResourceTreeElement = class ResourceTreeElement extends WebInspector.SourceCodeTreeElement
27 {
28     constructor(resource, representedObject)
29     {
30         console.assert(resource instanceof WebInspector.Resource);
31
32         super(resource, ["resource", WebInspector.ResourceTreeElement.ResourceIconStyleClassName, resource.type], "", "", representedObject || resource, false);
33
34         this._updateResource(resource);
35     }
36
37     // Static
38
39     static compareResourceTreeElements(a, b)
40     {
41         // Compare by type first to keep resources grouped by type when not sorted into folders.
42         var comparisonResult = a.resource.type.localeCompare(b.resource.type);
43         if (comparisonResult !== 0)
44             return comparisonResult;
45
46         // Compare async resource types by their first timestamp so they are in chronological order.
47         if (a.resource.type === WebInspector.Resource.Type.XHR || a.resource.type === WebInspector.Resource.Type.WebSocket)
48             return a.resource.firstTimestamp - b.resource.firstTimestamp || 0;
49
50         // Compare by subtitle when the types are the same. The subtitle is used to show the
51         // domain of the resource. This causes resources to group by domain. If the resource
52         // is on the same domain as the frame it will have an empty subtitle. This is good
53         // because empty string sorts first, so those will appear before external resources.
54         comparisonResult = a.subtitle.localeCompare(b.subtitle);
55         if (comparisonResult !== 0)
56             return comparisonResult;
57
58         // Compare by title when the subtitles are the same.
59         return a.mainTitle.localeCompare(b.mainTitle);
60     }
61
62     static compareFolderAndResourceTreeElements(a, b)
63     {
64         var aIsFolder = a instanceof WebInspector.FolderTreeElement;
65         var bIsFolder = b instanceof WebInspector.FolderTreeElement;
66
67         if (aIsFolder && !bIsFolder)
68             return -1;
69         if (!aIsFolder && bIsFolder)
70             return 1;
71         if (aIsFolder && bIsFolder)
72             return a.mainTitle.localeCompare(b.mainTitle);
73
74         return WebInspector.ResourceTreeElement.compareResourceTreeElements(a, b);
75     }
76
77     // Public
78
79     get resource()
80     {
81         return this._resource;
82     }
83
84     get filterableData()
85     {
86         return {text: this._resource.url};
87     }
88
89     ondblclick()
90     {
91         InspectorFrontendHost.openInNewTab(this._resource.url);
92     }
93
94     // Protected (Used by FrameTreeElement)
95
96     _updateResource(resource)
97     {
98         console.assert(resource instanceof WebInspector.Resource);
99
100         // This method is for subclasses like FrameTreeElement who don't use a resource as the representedObject.
101         // This method should only be called once if the representedObject is a resource, since changing the resource
102         // without changing the representedObject is bad. If you need to change the resource, make a new ResourceTreeElement.
103         console.assert(!this._resource || !(this.representedObject instanceof WebInspector.Resource));
104
105         if (this._resource) {
106             this._resource.removeEventListener(WebInspector.Resource.Event.URLDidChange, this._urlDidChange, this);
107             this._resource.removeEventListener(WebInspector.Resource.Event.TypeDidChange, this._typeDidChange, this);
108             this._resource.removeEventListener(WebInspector.Resource.Event.LoadingDidFinish, this._updateStatus, this);
109             this._resource.removeEventListener(WebInspector.Resource.Event.LoadingDidFail, this._updateStatus, this);
110         }
111
112         this._updateSourceCode(resource);
113
114         this._resource = resource;
115
116         resource.addEventListener(WebInspector.Resource.Event.URLDidChange, this._urlDidChange, this);
117         resource.addEventListener(WebInspector.Resource.Event.TypeDidChange, this._typeDidChange, this);
118         resource.addEventListener(WebInspector.Resource.Event.LoadingDidFinish, this._updateStatus, this);
119         resource.addEventListener(WebInspector.Resource.Event.LoadingDidFail, this._updateStatus, this);
120
121         this._updateTitles();
122         this._updateStatus();
123         this._updateToolTip();
124     }
125
126     // Protected
127
128     _updateTitles()
129     {
130         var frame = this._resource.parentFrame;
131         var isMainResource = this._resource.isMainResource();
132         if (isMainResource && frame) {
133             // When the resource is a main resource, get the host from the current frame's parent frame instead of the current frame.
134             var parentResourceHost = frame.parentFrame ? frame.parentFrame.mainResource.urlComponents.host : null;
135         } else if (frame) {
136             // When the resource is a normal sub-resource, get the host from the current frame's main resource.
137             var parentResourceHost = frame.mainResource.urlComponents.host;
138         }
139
140         var urlComponents = this._resource.urlComponents;
141
142         var oldMainTitle = this.mainTitle;
143         this.mainTitle = WebInspector.displayNameForURL(this._resource.url, urlComponents);
144
145         // Show the host as the subtitle if it is different from the main resource or if this is the main frame's main resource.
146         var subtitle = parentResourceHost !== urlComponents.host || frame.isMainFrame() && isMainResource ? WebInspector.displayNameForHost(urlComponents.host) : null;
147         this.subtitle = this.mainTitle !== subtitle ? subtitle : null;
148
149         if (oldMainTitle !== this.mainTitle)
150             this.callFirstAncestorFunction("descendantResourceTreeElementMainTitleDidChange", [this, oldMainTitle]);
151     }
152
153     // Private
154
155     _updateStatus()
156     {
157         if (this._resource.failed)
158             this.addClassName(WebInspector.ResourceTreeElement.FailedStyleClassName);
159         else
160             this.removeClassName(WebInspector.ResourceTreeElement.FailedStyleClassName);
161
162         if (this._resource.finished || this._resource.failed) {
163             // Remove the spinner.
164             this.status = "";
165         } else {
166             var spinner = new WebInspector.IndeterminateProgressSpinner;
167             this.status = spinner.element;
168         }
169     }
170
171     _updateToolTip()
172     {
173         this.tooltip = this._resource.url;
174     }
175
176     _urlDidChange(event)
177     {
178         this._updateTitles();
179         this._updateToolTip();
180     }
181
182     _typeDidChange(event)
183     {
184         this.removeClassName(event.data.oldType);
185         this.addClassName(this._resource.type);
186
187         this.callFirstAncestorFunction("descendantResourceTreeElementTypeDidChange", [this, event.data.oldType]);
188     }
189 };
190
191 WebInspector.ResourceTreeElement.ResourceIconStyleClassName = "resource-icon";
192 WebInspector.ResourceTreeElement.FailedStyleClassName = "failed";