OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * | 10 * |
11 * 2. Redistributions in binary form must reproduce the above | 11 * 2. Redistributions in binary form must reproduce the above |
12 * copyright notice, this list of conditions and the following disclaimer | 12 * copyright notice, this list of conditions and the following disclaimer |
13 * in the documentation and/or other materials provided with the | 13 * in the documentation and/or other materials provided with the |
14 * distribution. | 14 * distribution. |
15 * | 15 * |
16 * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS | 16 * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS |
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC. | 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC. |
20 * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 20 * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 */ | 27 */ |
28 | |
29 /** | 28 /** |
30 * @constructor | 29 * @unrestricted |
31 * @extends {WebInspector.SDKModel} | |
32 * @param {!WebInspector.Target} target | |
33 * @param {!WebInspector.ResourceTreeModel} resourceTreeModel | |
34 */ | 30 */ |
35 WebInspector.ApplicationCacheModel = function(target, resourceTreeModel) | 31 WebInspector.ApplicationCacheModel = class extends WebInspector.SDKModel { |
36 { | 32 /** |
37 WebInspector.SDKModel.call(this, WebInspector.ApplicationCacheModel, target)
; | 33 * @param {!WebInspector.Target} target |
| 34 * @param {!WebInspector.ResourceTreeModel} resourceTreeModel |
| 35 */ |
| 36 constructor(target, resourceTreeModel) { |
| 37 super(WebInspector.ApplicationCacheModel, target); |
38 | 38 |
39 target.registerApplicationCacheDispatcher(new WebInspector.ApplicationCacheD
ispatcher(this)); | 39 target.registerApplicationCacheDispatcher(new WebInspector.ApplicationCacheD
ispatcher(this)); |
40 this._agent = target.applicationCacheAgent(); | 40 this._agent = target.applicationCacheAgent(); |
41 this._agent.enable(); | 41 this._agent.enable(); |
42 | 42 |
43 resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.Events.Fra
meNavigated, this._frameNavigated, this); | 43 resourceTreeModel.addEventListener( |
| 44 WebInspector.ResourceTreeModel.Events.FrameNavigated, this._frameNavigat
ed, this); |
44 resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.Events.Fra
meDetached, this._frameDetached, this); | 45 resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.Events.Fra
meDetached, this._frameDetached, this); |
45 | 46 |
46 this._statuses = {}; | 47 this._statuses = {}; |
47 this._manifestURLsByFrame = {}; | 48 this._manifestURLsByFrame = {}; |
48 | 49 |
49 this._mainFrameNavigated(); | 50 this._mainFrameNavigated(); |
50 this._onLine = true; | 51 this._onLine = true; |
| 52 } |
| 53 |
| 54 /** |
| 55 * @param {!WebInspector.Target} target |
| 56 * @return {?WebInspector.ApplicationCacheModel} |
| 57 */ |
| 58 static fromTarget(target) { |
| 59 return /** @type {?WebInspector.ApplicationCacheModel} */ (target.model(WebI
nspector.ApplicationCacheModel)); |
| 60 } |
| 61 |
| 62 _frameNavigated(event) { |
| 63 var frame = /** @type {!WebInspector.ResourceTreeFrame} */ (event.data); |
| 64 if (frame.isMainFrame()) { |
| 65 this._mainFrameNavigated(); |
| 66 return; |
| 67 } |
| 68 |
| 69 this._agent.getManifestForFrame(frame.id, this._manifestForFrameLoaded.bind(
this, frame.id)); |
| 70 } |
| 71 |
| 72 /** |
| 73 * @param {!WebInspector.Event} event |
| 74 */ |
| 75 _frameDetached(event) { |
| 76 var frame = /** @type {!WebInspector.ResourceTreeFrame} */ (event.data); |
| 77 this._frameManifestRemoved(frame.id); |
| 78 } |
| 79 |
| 80 reset() { |
| 81 this._statuses = {}; |
| 82 this._manifestURLsByFrame = {}; |
| 83 this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.Events.Fram
eManifestsReset); |
| 84 } |
| 85 |
| 86 _mainFrameNavigated() { |
| 87 this._agent.getFramesWithManifests(this._framesWithManifestsLoaded.bind(this
)); |
| 88 } |
| 89 |
| 90 /** |
| 91 * @param {string} frameId |
| 92 * @param {?Protocol.Error} error |
| 93 * @param {string} manifestURL |
| 94 */ |
| 95 _manifestForFrameLoaded(frameId, error, manifestURL) { |
| 96 if (error) { |
| 97 console.error(error); |
| 98 return; |
| 99 } |
| 100 |
| 101 if (!manifestURL) |
| 102 this._frameManifestRemoved(frameId); |
| 103 } |
| 104 |
| 105 /** |
| 106 * @param {?Protocol.Error} error |
| 107 * @param {!Array.<!ApplicationCacheAgent.FrameWithManifest>} framesWithManife
sts |
| 108 */ |
| 109 _framesWithManifestsLoaded(error, framesWithManifests) { |
| 110 if (error) { |
| 111 console.error(error); |
| 112 return; |
| 113 } |
| 114 |
| 115 for (var i = 0; i < framesWithManifests.length; ++i) |
| 116 this._frameManifestUpdated( |
| 117 framesWithManifests[i].frameId, framesWithManifests[i].manifestURL, fr
amesWithManifests[i].status); |
| 118 } |
| 119 |
| 120 /** |
| 121 * @param {string} frameId |
| 122 * @param {string} manifestURL |
| 123 * @param {number} status |
| 124 */ |
| 125 _frameManifestUpdated(frameId, manifestURL, status) { |
| 126 if (status === applicationCache.UNCACHED) { |
| 127 this._frameManifestRemoved(frameId); |
| 128 return; |
| 129 } |
| 130 |
| 131 if (!manifestURL) |
| 132 return; |
| 133 |
| 134 if (this._manifestURLsByFrame[frameId] && manifestURL !== this._manifestURLs
ByFrame[frameId]) |
| 135 this._frameManifestRemoved(frameId); |
| 136 |
| 137 var statusChanged = this._statuses[frameId] !== status; |
| 138 this._statuses[frameId] = status; |
| 139 |
| 140 if (!this._manifestURLsByFrame[frameId]) { |
| 141 this._manifestURLsByFrame[frameId] = manifestURL; |
| 142 this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.Events.Fr
ameManifestAdded, frameId); |
| 143 } |
| 144 |
| 145 if (statusChanged) |
| 146 this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.Events.Fr
ameManifestStatusUpdated, frameId); |
| 147 } |
| 148 |
| 149 /** |
| 150 * @param {string} frameId |
| 151 */ |
| 152 _frameManifestRemoved(frameId) { |
| 153 if (!this._manifestURLsByFrame[frameId]) |
| 154 return; |
| 155 |
| 156 delete this._manifestURLsByFrame[frameId]; |
| 157 delete this._statuses[frameId]; |
| 158 |
| 159 this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.Events.Fram
eManifestRemoved, frameId); |
| 160 } |
| 161 |
| 162 /** |
| 163 * @param {string} frameId |
| 164 * @return {string} |
| 165 */ |
| 166 frameManifestURL(frameId) { |
| 167 return this._manifestURLsByFrame[frameId] || ''; |
| 168 } |
| 169 |
| 170 /** |
| 171 * @param {string} frameId |
| 172 * @return {number} |
| 173 */ |
| 174 frameManifestStatus(frameId) { |
| 175 return this._statuses[frameId] || applicationCache.UNCACHED; |
| 176 } |
| 177 |
| 178 /** |
| 179 * @return {boolean} |
| 180 */ |
| 181 get onLine() { |
| 182 return this._onLine; |
| 183 } |
| 184 |
| 185 /** |
| 186 * @param {string} frameId |
| 187 * @param {string} manifestURL |
| 188 * @param {number} status |
| 189 */ |
| 190 _statusUpdated(frameId, manifestURL, status) { |
| 191 this._frameManifestUpdated(frameId, manifestURL, status); |
| 192 } |
| 193 |
| 194 /** |
| 195 * @param {string} frameId |
| 196 * @param {function(?ApplicationCacheAgent.ApplicationCache)} callback |
| 197 */ |
| 198 requestApplicationCache(frameId, callback) { |
| 199 /** |
| 200 * @param {?Protocol.Error} error |
| 201 * @param {!ApplicationCacheAgent.ApplicationCache} applicationCache |
| 202 */ |
| 203 function callbackWrapper(error, applicationCache) { |
| 204 if (error) { |
| 205 console.error(error); |
| 206 callback(null); |
| 207 return; |
| 208 } |
| 209 |
| 210 callback(applicationCache); |
| 211 } |
| 212 |
| 213 this._agent.getApplicationCacheForFrame(frameId, callbackWrapper); |
| 214 } |
| 215 |
| 216 /** |
| 217 * @param {boolean} isNowOnline |
| 218 */ |
| 219 _networkStateUpdated(isNowOnline) { |
| 220 this._onLine = isNowOnline; |
| 221 this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.Events.Netw
orkStateChanged, isNowOnline); |
| 222 } |
51 }; | 223 }; |
52 | 224 |
53 /** @enum {symbol} */ | 225 /** @enum {symbol} */ |
54 WebInspector.ApplicationCacheModel.Events = { | 226 WebInspector.ApplicationCacheModel.Events = { |
55 FrameManifestStatusUpdated: Symbol("FrameManifestStatusUpdated"), | 227 FrameManifestStatusUpdated: Symbol('FrameManifestStatusUpdated'), |
56 FrameManifestAdded: Symbol("FrameManifestAdded"), | 228 FrameManifestAdded: Symbol('FrameManifestAdded'), |
57 FrameManifestRemoved: Symbol("FrameManifestRemoved"), | 229 FrameManifestRemoved: Symbol('FrameManifestRemoved'), |
58 FrameManifestsReset: Symbol("FrameManifestsReset"), | 230 FrameManifestsReset: Symbol('FrameManifestsReset'), |
59 NetworkStateChanged: Symbol("NetworkStateChanged") | 231 NetworkStateChanged: Symbol('NetworkStateChanged') |
60 }; | 232 }; |
61 | 233 |
62 WebInspector.ApplicationCacheModel.prototype = { | 234 /** |
63 _frameNavigated: function(event) | 235 * @implements {ApplicationCacheAgent.Dispatcher} |
64 { | 236 * @unrestricted |
65 var frame = /** @type {!WebInspector.ResourceTreeFrame} */ (event.data); | 237 */ |
66 if (frame.isMainFrame()) { | 238 WebInspector.ApplicationCacheDispatcher = class { |
67 this._mainFrameNavigated(); | 239 constructor(applicationCacheModel) { |
68 return; | 240 this._applicationCacheModel = applicationCacheModel; |
69 } | 241 } |
70 | 242 |
71 this._agent.getManifestForFrame(frame.id, this._manifestForFrameLoaded.b
ind(this, frame.id)); | 243 /** |
72 }, | 244 * @override |
73 | 245 * @param {string} frameId |
74 /** | 246 * @param {string} manifestURL |
75 * @param {!WebInspector.Event} event | 247 * @param {number} status |
76 */ | 248 */ |
77 _frameDetached: function(event) | 249 applicationCacheStatusUpdated(frameId, manifestURL, status) { |
78 { | 250 this._applicationCacheModel._statusUpdated(frameId, manifestURL, status); |
79 var frame = /** @type {!WebInspector.ResourceTreeFrame} */ (event.data); | 251 } |
80 this._frameManifestRemoved(frame.id); | 252 |
81 }, | 253 /** |
82 | 254 * @override |
83 reset: function() | 255 * @param {boolean} isNowOnline |
84 { | 256 */ |
85 this._statuses = {}; | 257 networkStateUpdated(isNowOnline) { |
86 this._manifestURLsByFrame = {}; | 258 this._applicationCacheModel._networkStateUpdated(isNowOnline); |
87 this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.Events.
FrameManifestsReset); | 259 } |
88 }, | |
89 | |
90 _mainFrameNavigated: function() | |
91 { | |
92 this._agent.getFramesWithManifests(this._framesWithManifestsLoaded.bind(
this)); | |
93 }, | |
94 | |
95 /** | |
96 * @param {string} frameId | |
97 * @param {?Protocol.Error} error | |
98 * @param {string} manifestURL | |
99 */ | |
100 _manifestForFrameLoaded: function(frameId, error, manifestURL) | |
101 { | |
102 if (error) { | |
103 console.error(error); | |
104 return; | |
105 } | |
106 | |
107 if (!manifestURL) | |
108 this._frameManifestRemoved(frameId); | |
109 }, | |
110 | |
111 /** | |
112 * @param {?Protocol.Error} error | |
113 * @param {!Array.<!ApplicationCacheAgent.FrameWithManifest>} framesWithMani
fests | |
114 */ | |
115 _framesWithManifestsLoaded: function(error, framesWithManifests) | |
116 { | |
117 if (error) { | |
118 console.error(error); | |
119 return; | |
120 } | |
121 | |
122 for (var i = 0; i < framesWithManifests.length; ++i) | |
123 this._frameManifestUpdated(framesWithManifests[i].frameId, framesWit
hManifests[i].manifestURL, framesWithManifests[i].status); | |
124 }, | |
125 | |
126 /** | |
127 * @param {string} frameId | |
128 * @param {string} manifestURL | |
129 * @param {number} status | |
130 */ | |
131 _frameManifestUpdated: function(frameId, manifestURL, status) | |
132 { | |
133 if (status === applicationCache.UNCACHED) { | |
134 this._frameManifestRemoved(frameId); | |
135 return; | |
136 } | |
137 | |
138 if (!manifestURL) | |
139 return; | |
140 | |
141 if (this._manifestURLsByFrame[frameId] && manifestURL !== this._manifest
URLsByFrame[frameId]) | |
142 this._frameManifestRemoved(frameId); | |
143 | |
144 var statusChanged = this._statuses[frameId] !== status; | |
145 this._statuses[frameId] = status; | |
146 | |
147 if (!this._manifestURLsByFrame[frameId]) { | |
148 this._manifestURLsByFrame[frameId] = manifestURL; | |
149 this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.Eve
nts.FrameManifestAdded, frameId); | |
150 } | |
151 | |
152 if (statusChanged) | |
153 this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.Eve
nts.FrameManifestStatusUpdated, frameId); | |
154 }, | |
155 | |
156 /** | |
157 * @param {string} frameId | |
158 */ | |
159 _frameManifestRemoved: function(frameId) | |
160 { | |
161 if (!this._manifestURLsByFrame[frameId]) | |
162 return; | |
163 | |
164 delete this._manifestURLsByFrame[frameId]; | |
165 delete this._statuses[frameId]; | |
166 | |
167 this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.Events.
FrameManifestRemoved, frameId); | |
168 }, | |
169 | |
170 /** | |
171 * @param {string} frameId | |
172 * @return {string} | |
173 */ | |
174 frameManifestURL: function(frameId) | |
175 { | |
176 return this._manifestURLsByFrame[frameId] || ""; | |
177 }, | |
178 | |
179 /** | |
180 * @param {string} frameId | |
181 * @return {number} | |
182 */ | |
183 frameManifestStatus: function(frameId) | |
184 { | |
185 return this._statuses[frameId] || applicationCache.UNCACHED; | |
186 }, | |
187 | |
188 /** | |
189 * @return {boolean} | |
190 */ | |
191 get onLine() | |
192 { | |
193 return this._onLine; | |
194 }, | |
195 | |
196 /** | |
197 * @param {string} frameId | |
198 * @param {string} manifestURL | |
199 * @param {number} status | |
200 */ | |
201 _statusUpdated: function(frameId, manifestURL, status) | |
202 { | |
203 this._frameManifestUpdated(frameId, manifestURL, status); | |
204 }, | |
205 | |
206 /** | |
207 * @param {string} frameId | |
208 * @param {function(?ApplicationCacheAgent.ApplicationCache)} callback | |
209 */ | |
210 requestApplicationCache: function(frameId, callback) | |
211 { | |
212 /** | |
213 * @param {?Protocol.Error} error | |
214 * @param {!ApplicationCacheAgent.ApplicationCache} applicationCache | |
215 */ | |
216 function callbackWrapper(error, applicationCache) | |
217 { | |
218 if (error) { | |
219 console.error(error); | |
220 callback(null); | |
221 return; | |
222 } | |
223 | |
224 callback(applicationCache); | |
225 } | |
226 | |
227 this._agent.getApplicationCacheForFrame(frameId, callbackWrapper); | |
228 }, | |
229 | |
230 /** | |
231 * @param {boolean} isNowOnline | |
232 */ | |
233 _networkStateUpdated: function(isNowOnline) | |
234 { | |
235 this._onLine = isNowOnline; | |
236 this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.Events.
NetworkStateChanged, isNowOnline); | |
237 }, | |
238 | |
239 __proto__: WebInspector.SDKModel.prototype | |
240 }; | 260 }; |
241 | 261 |
242 /** | 262 |
243 * @constructor | |
244 * @implements {ApplicationCacheAgent.Dispatcher} | |
245 */ | |
246 WebInspector.ApplicationCacheDispatcher = function(applicationCacheModel) | |
247 { | |
248 this._applicationCacheModel = applicationCacheModel; | |
249 }; | |
250 | |
251 WebInspector.ApplicationCacheDispatcher.prototype = { | |
252 /** | |
253 * @override | |
254 * @param {string} frameId | |
255 * @param {string} manifestURL | |
256 * @param {number} status | |
257 */ | |
258 applicationCacheStatusUpdated: function(frameId, manifestURL, status) | |
259 { | |
260 this._applicationCacheModel._statusUpdated(frameId, manifestURL, status)
; | |
261 }, | |
262 | |
263 /** | |
264 * @override | |
265 * @param {boolean} isNowOnline | |
266 */ | |
267 networkStateUpdated: function(isNowOnline) | |
268 { | |
269 this._applicationCacheModel._networkStateUpdated(isNowOnline); | |
270 } | |
271 }; | |
272 | |
273 /** | |
274 * @param {!WebInspector.Target} target | |
275 * @return {?WebInspector.ApplicationCacheModel} | |
276 */ | |
277 WebInspector.ApplicationCacheModel.fromTarget = function(target) | |
278 { | |
279 return /** @type {?WebInspector.ApplicationCacheModel} */ (target.model(WebI
nspector.ApplicationCacheModel)); | |
280 }; | |
OLD | NEW |