Web Inspector: DOM: provide a way to disable/breakpoint all event listeners for a...
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Views / ApplicationCacheDetailsSidebarPanel.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 WI.ApplicationCacheDetailsSidebarPanel = class ApplicationCacheDetailsSidebarPanel extends WI.DetailsSidebarPanel
27 {
28     constructor()
29     {
30         super("application-cache-details", WI.UIString("Storage"));
31
32         this.element.classList.add("application-cache");
33
34         this._applicationCacheFrame = null;
35     }
36
37     // Public
38
39     inspect(objects)
40     {
41         // Convert to a single item array if needed.
42         if (!(objects instanceof Array))
43             objects = [objects];
44
45         var applicationCacheFrameToInspect = null;
46
47         // Iterate over the objects to find a WI.ApplicationCacheFrame to inspect.
48         for (var i = 0; i < objects.length; ++i) {
49             if (objects[i] instanceof WI.ApplicationCacheFrame) {
50                 applicationCacheFrameToInspect = objects[i];
51                 break;
52             }
53         }
54
55         this.applicationCacheFrame = applicationCacheFrameToInspect;
56
57         return !!this.applicationCacheFrame;
58     }
59
60     get applicationCacheFrame()
61     {
62         return this._applicationCacheFrame;
63     }
64
65     set applicationCacheFrame(applicationCacheFrame)
66     {
67         if (this._applicationCacheFrame === applicationCacheFrame)
68             return;
69
70         this._applicationCacheFrame = applicationCacheFrame;
71
72         this.needsLayout();
73     }
74
75     closed()
76     {
77         WI.applicationCacheManager.removeEventListener(null, null, this);
78
79         super.closed();
80     }
81
82     // Protected
83
84     initialLayout()
85     {
86         super.initialLayout();
87
88         this._locationManifestURLRow = new WI.DetailsSectionSimpleRow(WI.UIString("Manifest URL"));
89         this._locationFrameURLRow = new WI.DetailsSectionSimpleRow(WI.UIString("Frame URL"));
90
91         let locationGroup = new WI.DetailsSectionGroup([this._locationManifestURLRow, this._locationFrameURLRow]);
92         let locationSection = new WI.DetailsSection("application-cache-location", WI.UIString("Location"), [locationGroup]);
93
94         this._onlineRow = new WI.DetailsSectionSimpleRow(WI.UIString("Online"));
95         this._statusRow = new WI.DetailsSectionSimpleRow(WI.UIString("Status"));
96
97         let statusGroup = new WI.DetailsSectionGroup([this._onlineRow, this._statusRow]);
98         let statusSection = new WI.DetailsSection("application-cache-status", WI.UIString("Status"), [statusGroup]);
99
100         this.contentView.element.appendChild(locationSection.element);
101         this.contentView.element.appendChild(statusSection.element);
102
103         WI.applicationCacheManager.addEventListener(WI.ApplicationCacheManager.Event.NetworkStateUpdated, this._networkStateUpdated, this);
104         WI.applicationCacheManager.addEventListener(WI.ApplicationCacheManager.Event.FrameManifestStatusChanged, this._frameManifestStatusChanged, this);
105     }
106
107     layout()
108     {
109         super.layout();
110
111         if (!this.applicationCacheFrame)
112             return;
113
114         this._locationFrameURLRow.value = this.applicationCacheFrame.frame.url;
115         this._locationManifestURLRow.value = this.applicationCacheFrame.manifest.manifestURL;
116
117         this._refreshOnlineRow();
118         this._refreshStatusRow();
119     }
120
121     // Private
122
123     _networkStateUpdated(event)
124     {
125         if (!this.applicationCacheFrame)
126             return;
127
128         this._refreshOnlineRow();
129     }
130
131     _frameManifestStatusChanged(event)
132     {
133         if (!this.applicationCacheFrame)
134             return;
135
136         console.assert(event.data.frameManifest instanceof WI.ApplicationCacheFrame);
137         if (event.data.frameManifest !== this.applicationCacheFrame)
138             return;
139
140         this._refreshStatusRow();
141     }
142
143     _refreshOnlineRow()
144     {
145         this._onlineRow.value = WI.applicationCacheManager.online ? WI.UIString("Yes") : WI.UIString("No");
146     }
147
148     _refreshStatusRow()
149     {
150         this._statusRow.value = WI.ApplicationCacheDetailsSidebarPanel.Status[this.applicationCacheFrame.status];
151     }
152 };
153
154 // This needs to be kept in sync with ApplicationCacheManager.js.
155 WI.ApplicationCacheDetailsSidebarPanel.Status = {
156     0: "Uncached",
157     1: "Idle",
158     2: "Checking",
159     3: "Downloading",
160     4: "UpdateReady",
161     5: "Obsolete"
162 };