OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 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 * * Redistributions of source code must retain the above copyright | 8 * * 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 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
11 * copyright notice, this list of conditions and the following disclaimer | 11 * copyright notice, this list of conditions and the following disclaimer |
12 * in the documentation and/or other materials provided with the | 12 * in the documentation and/or other materials provided with the |
13 * distribution. | 13 * distribution. |
14 * * Neither the name of Google Inc. nor the names of its | 14 * * Neither the name of Google Inc. nor the names of its |
15 * contributors may be used to endorse or promote products derived from | 15 * contributors may be used to endorse or promote products derived from |
16 * this software without specific prior written permission. | 16 * this software without specific prior written permission. |
17 * | 17 * |
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | |
31 /** | 30 /** |
32 * @constructor | 31 * @unrestricted |
33 * @param {!WebInspector.SettingsStorage} storage | |
34 */ | 32 */ |
35 WebInspector.Settings = function(storage) | 33 WebInspector.Settings = class { |
36 { | 34 /** |
| 35 * @param {!WebInspector.SettingsStorage} storage |
| 36 */ |
| 37 constructor(storage) { |
37 this._settingsStorage = storage; | 38 this._settingsStorage = storage; |
38 var clearLocalStorage = window.localStorage ? window.localStorage.clear.bind
(window.localStorage) : undefined; | 39 var clearLocalStorage = window.localStorage ? window.localStorage.clear.bind
(window.localStorage) : undefined; |
39 this._localStorage = new WebInspector.SettingsStorage(window.localStorage ||
{}, undefined, undefined, clearLocalStorage); | 40 this._localStorage = |
| 41 new WebInspector.SettingsStorage(window.localStorage || {}, undefined, u
ndefined, clearLocalStorage); |
40 | 42 |
41 this._eventSupport = new WebInspector.Object(); | 43 this._eventSupport = new WebInspector.Object(); |
42 /** @type {!Map<string, !WebInspector.Setting>} */ | 44 /** @type {!Map<string, !WebInspector.Setting>} */ |
43 this._registry = new Map(); | 45 this._registry = new Map(); |
44 /** @type {!Map<string, !WebInspector.Setting>} */ | 46 /** @type {!Map<string, !WebInspector.Setting>} */ |
45 this._moduleSettings = new Map(); | 47 this._moduleSettings = new Map(); |
46 self.runtime.extensions("setting").forEach(this._registerModuleSetting.bind(
this)); | 48 self.runtime.extensions('setting').forEach(this._registerModuleSetting.bind(
this)); |
| 49 } |
| 50 |
| 51 /** |
| 52 * @param {!Runtime.Extension} extension |
| 53 */ |
| 54 _registerModuleSetting(extension) { |
| 55 var descriptor = extension.descriptor(); |
| 56 var settingName = descriptor['settingName']; |
| 57 var settingType = descriptor['settingType']; |
| 58 var defaultValue = descriptor['defaultValue']; |
| 59 var isLocal = !!descriptor['local']; |
| 60 var setting = settingType === 'regex' ? this.createRegExpSetting(settingName
, defaultValue, undefined, isLocal) : |
| 61 this.createSetting(settingName, defa
ultValue, isLocal); |
| 62 this._moduleSettings.set(settingName, setting); |
| 63 } |
| 64 |
| 65 /** |
| 66 * @param {string} settingName |
| 67 * @return {!WebInspector.Setting} |
| 68 */ |
| 69 moduleSetting(settingName) { |
| 70 var setting = this._moduleSettings.get(settingName); |
| 71 if (!setting) |
| 72 throw new Error('No setting registered: ' + settingName); |
| 73 return setting; |
| 74 } |
| 75 |
| 76 /** |
| 77 * @param {string} settingName |
| 78 * @return {!WebInspector.Setting} |
| 79 */ |
| 80 settingForTest(settingName) { |
| 81 var setting = this._registry.get(settingName); |
| 82 if (!setting) |
| 83 throw new Error('No setting registered: ' + settingName); |
| 84 return setting; |
| 85 } |
| 86 |
| 87 /** |
| 88 * @param {string} key |
| 89 * @param {*} defaultValue |
| 90 * @param {boolean=} isLocal |
| 91 * @return {!WebInspector.Setting} |
| 92 */ |
| 93 createSetting(key, defaultValue, isLocal) { |
| 94 if (!this._registry.get(key)) |
| 95 this._registry.set( |
| 96 key, new WebInspector.Setting( |
| 97 this, key, defaultValue, this._eventSupport, isLocal ? this._
localStorage : this._settingsStorage)); |
| 98 return /** @type {!WebInspector.Setting} */ (this._registry.get(key)); |
| 99 } |
| 100 |
| 101 /** |
| 102 * @param {string} key |
| 103 * @param {*} defaultValue |
| 104 * @return {!WebInspector.Setting} |
| 105 */ |
| 106 createLocalSetting(key, defaultValue) { |
| 107 return this.createSetting(key, defaultValue, true); |
| 108 } |
| 109 |
| 110 /** |
| 111 * @param {string} key |
| 112 * @param {string} defaultValue |
| 113 * @param {string=} regexFlags |
| 114 * @param {boolean=} isLocal |
| 115 * @return {!WebInspector.RegExpSetting} |
| 116 */ |
| 117 createRegExpSetting(key, defaultValue, regexFlags, isLocal) { |
| 118 if (!this._registry.get(key)) |
| 119 this._registry.set( |
| 120 key, new WebInspector.RegExpSetting( |
| 121 this, key, defaultValue, this._eventSupport, isLocal ? this._
localStorage : this._settingsStorage, |
| 122 regexFlags)); |
| 123 return /** @type {!WebInspector.RegExpSetting} */ (this._registry.get(key)); |
| 124 } |
| 125 |
| 126 clearAll() { |
| 127 this._settingsStorage.removeAll(); |
| 128 this._localStorage.removeAll(); |
| 129 var versionSetting = WebInspector.settings.createSetting(WebInspector.Versio
nController._currentVersionName, 0); |
| 130 versionSetting.set(WebInspector.VersionController.currentVersion); |
| 131 } |
47 }; | 132 }; |
48 | 133 |
49 WebInspector.Settings.prototype = { | |
50 /** | |
51 * @param {!Runtime.Extension} extension | |
52 */ | |
53 _registerModuleSetting: function(extension) | |
54 { | |
55 var descriptor = extension.descriptor(); | |
56 var settingName = descriptor["settingName"]; | |
57 var settingType = descriptor["settingType"]; | |
58 var defaultValue = descriptor["defaultValue"]; | |
59 var isLocal = !!descriptor["local"]; | |
60 var setting = settingType === "regex" ? this.createRegExpSetting(setting
Name, defaultValue, undefined, isLocal) : this.createSetting(settingName, defaul
tValue, isLocal); | |
61 this._moduleSettings.set(settingName, setting); | |
62 }, | |
63 | |
64 /** | |
65 * @param {string} settingName | |
66 * @return {!WebInspector.Setting} | |
67 */ | |
68 moduleSetting: function(settingName) | |
69 { | |
70 var setting = this._moduleSettings.get(settingName); | |
71 if (!setting) | |
72 throw new Error("No setting registered: " + settingName); | |
73 return setting; | |
74 }, | |
75 | |
76 /** | |
77 * @param {string} settingName | |
78 * @return {!WebInspector.Setting} | |
79 */ | |
80 settingForTest: function(settingName) | |
81 { | |
82 var setting = this._registry.get(settingName); | |
83 if (!setting) | |
84 throw new Error("No setting registered: " + settingName); | |
85 return setting; | |
86 }, | |
87 | |
88 /** | |
89 * @param {string} key | |
90 * @param {*} defaultValue | |
91 * @param {boolean=} isLocal | |
92 * @return {!WebInspector.Setting} | |
93 */ | |
94 createSetting: function(key, defaultValue, isLocal) | |
95 { | |
96 if (!this._registry.get(key)) | |
97 this._registry.set(key, new WebInspector.Setting(this, key, defaultV
alue, this._eventSupport, isLocal ? this._localStorage : this._settingsStorage))
; | |
98 return /** @type {!WebInspector.Setting} */ (this._registry.get(key)); | |
99 }, | |
100 | |
101 /** | |
102 * @param {string} key | |
103 * @param {*} defaultValue | |
104 * @return {!WebInspector.Setting} | |
105 */ | |
106 createLocalSetting: function(key, defaultValue) | |
107 { | |
108 return this.createSetting(key, defaultValue, true); | |
109 }, | |
110 | |
111 /** | |
112 * @param {string} key | |
113 * @param {string} defaultValue | |
114 * @param {string=} regexFlags | |
115 * @param {boolean=} isLocal | |
116 * @return {!WebInspector.RegExpSetting} | |
117 */ | |
118 createRegExpSetting: function(key, defaultValue, regexFlags, isLocal) | |
119 { | |
120 if (!this._registry.get(key)) | |
121 this._registry.set(key, new WebInspector.RegExpSetting(this, key, de
faultValue, this._eventSupport, isLocal ? this._localStorage : this._settingsSto
rage, regexFlags)); | |
122 return /** @type {!WebInspector.RegExpSetting} */ (this._registry.get(ke
y)); | |
123 }, | |
124 | |
125 clearAll: function() | |
126 { | |
127 this._settingsStorage.removeAll(); | |
128 this._localStorage.removeAll(); | |
129 var versionSetting = WebInspector.settings.createSetting(WebInspector.Ve
rsionController._currentVersionName, 0); | |
130 versionSetting.set(WebInspector.VersionController.currentVersion); | |
131 } | |
132 }; | |
133 | |
134 /** | 134 /** |
135 * @constructor | 135 * @unrestricted |
136 * @param {!Object} object | |
137 * @param {function(string, string)=} setCallback | |
138 * @param {function(string)=} removeCallback | |
139 * @param {function(string)=} removeAllCallback | |
140 */ | 136 */ |
141 WebInspector.SettingsStorage = function(object, setCallback, removeCallback, rem
oveAllCallback) | 137 WebInspector.SettingsStorage = class { |
142 { | 138 /** |
| 139 * @param {!Object} object |
| 140 * @param {function(string, string)=} setCallback |
| 141 * @param {function(string)=} removeCallback |
| 142 * @param {function(string)=} removeAllCallback |
| 143 */ |
| 144 constructor(object, setCallback, removeCallback, removeAllCallback) { |
143 this._object = object; | 145 this._object = object; |
144 this._setCallback = setCallback || function() {}; | 146 this._setCallback = setCallback || function() {}; |
145 this._removeCallback = removeCallback || function() {}; | 147 this._removeCallback = removeCallback || function() {}; |
146 this._removeAllCallback = removeAllCallback || function() {}; | 148 this._removeAllCallback = removeAllCallback || function() {}; |
| 149 } |
| 150 |
| 151 /** |
| 152 * @param {string} name |
| 153 * @param {string} value |
| 154 */ |
| 155 set(name, value) { |
| 156 this._object[name] = value; |
| 157 this._setCallback(name, value); |
| 158 } |
| 159 |
| 160 /** |
| 161 * @param {string} name |
| 162 * @return {boolean} |
| 163 */ |
| 164 has(name) { |
| 165 return name in this._object; |
| 166 } |
| 167 |
| 168 /** |
| 169 * @param {string} name |
| 170 * @return {string} |
| 171 */ |
| 172 get(name) { |
| 173 return this._object[name]; |
| 174 } |
| 175 |
| 176 /** |
| 177 * @param {string} name |
| 178 */ |
| 179 remove(name) { |
| 180 delete this._object[name]; |
| 181 this._removeCallback(name); |
| 182 } |
| 183 |
| 184 removeAll() { |
| 185 this._object = {}; |
| 186 this._removeAllCallback(); |
| 187 } |
| 188 |
| 189 _dumpSizes() { |
| 190 WebInspector.console.log('Ten largest settings: '); |
| 191 |
| 192 var sizes = {__proto__: null}; |
| 193 for (var key in this._object) |
| 194 sizes[key] = this._object[key].length; |
| 195 var keys = Object.keys(sizes); |
| 196 |
| 197 function comparator(key1, key2) { |
| 198 return sizes[key2] - sizes[key1]; |
| 199 } |
| 200 |
| 201 keys.sort(comparator); |
| 202 |
| 203 for (var i = 0; i < 10 && i < keys.length; ++i) |
| 204 WebInspector.console.log('Setting: \'' + keys[i] + '\', size: ' + sizes[ke
ys[i]]); |
| 205 } |
147 }; | 206 }; |
148 | 207 |
149 WebInspector.SettingsStorage.prototype = { | |
150 /** | |
151 * @param {string} name | |
152 * @param {string} value | |
153 */ | |
154 set: function(name, value) | |
155 { | |
156 this._object[name] = value; | |
157 this._setCallback(name, value); | |
158 }, | |
159 | |
160 /** | |
161 * @param {string} name | |
162 * @return {boolean} | |
163 */ | |
164 has: function(name) | |
165 { | |
166 return name in this._object; | |
167 }, | |
168 | |
169 /** | |
170 * @param {string} name | |
171 * @return {string} | |
172 */ | |
173 get: function(name) | |
174 { | |
175 return this._object[name]; | |
176 }, | |
177 | |
178 /** | |
179 * @param {string} name | |
180 */ | |
181 remove: function(name) | |
182 { | |
183 delete this._object[name]; | |
184 this._removeCallback(name); | |
185 }, | |
186 | |
187 removeAll: function() | |
188 { | |
189 this._object = {}; | |
190 this._removeAllCallback(); | |
191 }, | |
192 | |
193 _dumpSizes: function() | |
194 { | |
195 WebInspector.console.log("Ten largest settings: "); | |
196 | |
197 var sizes = { __proto__: null }; | |
198 for (var key in this._object) | |
199 sizes[key] = this._object[key].length; | |
200 var keys = Object.keys(sizes); | |
201 | |
202 function comparator(key1, key2) | |
203 { | |
204 return sizes[key2] - sizes[key1]; | |
205 } | |
206 | |
207 keys.sort(comparator); | |
208 | |
209 for (var i = 0; i < 10 && i < keys.length; ++i) | |
210 WebInspector.console.log("Setting: '" + keys[i] + "', size: " + size
s[keys[i]]); | |
211 } | |
212 }; | |
213 | |
214 /** | 208 /** |
215 * @constructor | |
216 * @param {!WebInspector.Settings} settings | |
217 * @param {string} name | |
218 * @param {V} defaultValue | |
219 * @param {!WebInspector.Object} eventSupport | |
220 * @param {!WebInspector.SettingsStorage} storage | |
221 * @template V | 209 * @template V |
| 210 * @unrestricted |
222 */ | 211 */ |
223 WebInspector.Setting = function(settings, name, defaultValue, eventSupport, stor
age) | 212 WebInspector.Setting = class { |
224 { | 213 /** |
| 214 * @param {!WebInspector.Settings} settings |
| 215 * @param {string} name |
| 216 * @param {V} defaultValue |
| 217 * @param {!WebInspector.Object} eventSupport |
| 218 * @param {!WebInspector.SettingsStorage} storage |
| 219 */ |
| 220 constructor(settings, name, defaultValue, eventSupport, storage) { |
225 this._settings = settings; | 221 this._settings = settings; |
226 this._name = name; | 222 this._name = name; |
227 this._defaultValue = defaultValue; | 223 this._defaultValue = defaultValue; |
228 this._eventSupport = eventSupport; | 224 this._eventSupport = eventSupport; |
229 this._storage = storage; | 225 this._storage = storage; |
| 226 } |
| 227 |
| 228 /** |
| 229 * @param {function(!WebInspector.Event)} listener |
| 230 * @param {!Object=} thisObject |
| 231 */ |
| 232 addChangeListener(listener, thisObject) { |
| 233 this._eventSupport.addEventListener(this._name, listener, thisObject); |
| 234 } |
| 235 |
| 236 /** |
| 237 * @param {function(!WebInspector.Event)} listener |
| 238 * @param {!Object=} thisObject |
| 239 */ |
| 240 removeChangeListener(listener, thisObject) { |
| 241 this._eventSupport.removeEventListener(this._name, listener, thisObject); |
| 242 } |
| 243 |
| 244 get name() { |
| 245 return this._name; |
| 246 } |
| 247 |
| 248 /** |
| 249 * @return {V} |
| 250 */ |
| 251 get() { |
| 252 if (typeof this._value !== 'undefined') |
| 253 return this._value; |
| 254 |
| 255 this._value = this._defaultValue; |
| 256 if (this._storage.has(this._name)) { |
| 257 try { |
| 258 this._value = JSON.parse(this._storage.get(this._name)); |
| 259 } catch (e) { |
| 260 this._storage.remove(this._name); |
| 261 } |
| 262 } |
| 263 return this._value; |
| 264 } |
| 265 |
| 266 /** |
| 267 * @param {V} value |
| 268 */ |
| 269 set(value) { |
| 270 this._value = value; |
| 271 try { |
| 272 var settingString = JSON.stringify(value); |
| 273 try { |
| 274 this._storage.set(this._name, settingString); |
| 275 } catch (e) { |
| 276 this._printSettingsSavingError(e.message, this._name, settingString); |
| 277 } |
| 278 } catch (e) { |
| 279 WebInspector.console.error('Cannot stringify setting with name: ' + this._
name + ', error: ' + e.message); |
| 280 } |
| 281 this._eventSupport.dispatchEventToListeners(this._name, value); |
| 282 } |
| 283 |
| 284 remove() { |
| 285 this._settings._registry.delete(this._name); |
| 286 this._settings._moduleSettings.delete(this._name); |
| 287 this._storage.remove(this._name); |
| 288 } |
| 289 |
| 290 /** |
| 291 * @param {string} message |
| 292 * @param {string} name |
| 293 * @param {string} value |
| 294 */ |
| 295 _printSettingsSavingError(message, name, value) { |
| 296 var errorMessage = |
| 297 'Error saving setting with name: ' + this._name + ', value length: ' + v
alue.length + '. Error: ' + message; |
| 298 console.error(errorMessage); |
| 299 WebInspector.console.error(errorMessage); |
| 300 this._storage._dumpSizes(); |
| 301 } |
230 }; | 302 }; |
231 | 303 |
232 WebInspector.Setting.prototype = { | 304 /** |
233 /** | 305 * @unrestricted |
234 * @param {function(!WebInspector.Event)} listener | 306 */ |
235 * @param {!Object=} thisObject | 307 WebInspector.RegExpSetting = class extends WebInspector.Setting { |
236 */ | 308 /** |
237 addChangeListener: function(listener, thisObject) | 309 * @param {!WebInspector.Settings} settings |
238 { | 310 * @param {string} name |
239 this._eventSupport.addEventListener(this._name, listener, thisObject); | 311 * @param {string} defaultValue |
240 }, | 312 * @param {!WebInspector.Object} eventSupport |
241 | 313 * @param {!WebInspector.SettingsStorage} storage |
242 /** | 314 * @param {string=} regexFlags |
243 * @param {function(!WebInspector.Event)} listener | 315 */ |
244 * @param {!Object=} thisObject | 316 constructor(settings, name, defaultValue, eventSupport, storage, regexFlags) { |
245 */ | 317 super(settings, name, defaultValue ? [{pattern: defaultValue}] : [], eventSu
pport, storage); |
246 removeChangeListener: function(listener, thisObject) | 318 this._regexFlags = regexFlags; |
247 { | 319 } |
248 this._eventSupport.removeEventListener(this._name, listener, thisObject)
; | 320 |
249 }, | 321 /** |
250 | 322 * @override |
251 get name() | 323 * @return {string} |
252 { | 324 */ |
253 return this._name; | 325 get() { |
254 }, | 326 var result = []; |
255 | 327 var items = this.getAsArray(); |
256 /** | 328 for (var i = 0; i < items.length; ++i) { |
257 * @return {V} | 329 var item = items[i]; |
258 */ | 330 if (item.pattern && !item.disabled) |
259 get: function() | 331 result.push(item.pattern); |
260 { | 332 } |
261 if (typeof this._value !== "undefined") | 333 return result.join('|'); |
262 return this._value; | 334 } |
263 | 335 |
264 this._value = this._defaultValue; | 336 /** |
265 if (this._storage.has(this._name)) { | 337 * @return {!Array.<{pattern: string, disabled: (boolean|undefined)}>} |
266 try { | 338 */ |
267 this._value = JSON.parse(this._storage.get(this._name)); | 339 getAsArray() { |
268 } catch (e) { | 340 return super.get(); |
269 this._storage.remove(this._name); | 341 } |
270 } | 342 |
271 } | 343 /** |
272 return this._value; | 344 * @override |
273 }, | 345 * @param {string} value |
274 | 346 */ |
275 /** | 347 set(value) { |
276 * @param {V} value | 348 this.setAsArray([{pattern: value}]); |
277 */ | 349 } |
278 set: function(value) | 350 |
279 { | 351 /** |
280 this._value = value; | 352 * @param {!Array.<{pattern: string, disabled: (boolean|undefined)}>} value |
281 try { | 353 */ |
282 var settingString = JSON.stringify(value); | 354 setAsArray(value) { |
283 try { | 355 delete this._regex; |
284 this._storage.set(this._name, settingString); | 356 super.set(value); |
285 } catch (e) { | 357 } |
286 this._printSettingsSavingError(e.message, this._name, settingStr
ing); | 358 |
287 } | 359 /** |
288 } catch (e) { | 360 * @return {?RegExp} |
289 WebInspector.console.error("Cannot stringify setting with name: " +
this._name + ", error: " + e.message); | 361 */ |
290 } | 362 asRegExp() { |
291 this._eventSupport.dispatchEventToListeners(this._name, value); | 363 if (typeof this._regex !== 'undefined') |
292 }, | 364 return this._regex; |
293 | 365 this._regex = null; |
294 remove: function() | 366 try { |
295 { | 367 var pattern = this.get(); |
296 this._settings._registry.delete(this._name); | 368 if (pattern) |
297 this._settings._moduleSettings.delete(this._name); | 369 this._regex = new RegExp(pattern, this._regexFlags || ''); |
298 this._storage.remove(this._name); | 370 } catch (e) { |
299 }, | 371 } |
300 | 372 return this._regex; |
301 /** | 373 } |
302 * @param {string} message | |
303 * @param {string} name | |
304 * @param {string} value | |
305 */ | |
306 _printSettingsSavingError: function(message, name, value) | |
307 { | |
308 var errorMessage = "Error saving setting with name: " + this._name + ",
value length: " + value.length + ". Error: " + message; | |
309 console.error(errorMessage); | |
310 WebInspector.console.error(errorMessage); | |
311 this._storage._dumpSizes(); | |
312 } | |
313 }; | 374 }; |
314 | 375 |
315 /** | 376 /** |
316 * @constructor | 377 * @unrestricted |
317 * @extends {WebInspector.Setting} | |
318 * @param {!WebInspector.Settings} settings | |
319 * @param {string} name | |
320 * @param {string} defaultValue | |
321 * @param {!WebInspector.Object} eventSupport | |
322 * @param {!WebInspector.SettingsStorage} storage | |
323 * @param {string=} regexFlags | |
324 */ | 378 */ |
325 WebInspector.RegExpSetting = function(settings, name, defaultValue, eventSupport
, storage, regexFlags) | 379 WebInspector.VersionController = class { |
326 { | 380 updateVersion() { |
327 WebInspector.Setting.call(this, settings, name, defaultValue ? [{ pattern: d
efaultValue }] : [], eventSupport, storage); | 381 var localStorageVersion = |
328 this._regexFlags = regexFlags; | 382 window.localStorage ? window.localStorage[WebInspector.VersionController
._currentVersionName] : 0; |
| 383 var versionSetting = WebInspector.settings.createSetting(WebInspector.Versio
nController._currentVersionName, 0); |
| 384 var currentVersion = WebInspector.VersionController.currentVersion; |
| 385 var oldVersion = versionSetting.get() || parseInt(localStorageVersion || '0'
, 10); |
| 386 if (oldVersion === 0) { |
| 387 // First run, no need to do anything. |
| 388 versionSetting.set(currentVersion); |
| 389 return; |
| 390 } |
| 391 var methodsToRun = this._methodsToRunToUpdateVersion(oldVersion, currentVers
ion); |
| 392 for (var i = 0; i < methodsToRun.length; ++i) |
| 393 this[methodsToRun[i]].call(this); |
| 394 versionSetting.set(currentVersion); |
| 395 } |
| 396 |
| 397 /** |
| 398 * @param {number} oldVersion |
| 399 * @param {number} currentVersion |
| 400 */ |
| 401 _methodsToRunToUpdateVersion(oldVersion, currentVersion) { |
| 402 var result = []; |
| 403 for (var i = oldVersion; i < currentVersion; ++i) |
| 404 result.push('_updateVersionFrom' + i + 'To' + (i + 1)); |
| 405 return result; |
| 406 } |
| 407 |
| 408 _updateVersionFrom0To1() { |
| 409 this._clearBreakpointsWhenTooMany(WebInspector.settings.createLocalSetting('
breakpoints', []), 500000); |
| 410 } |
| 411 |
| 412 _updateVersionFrom1To2() { |
| 413 WebInspector.settings.createSetting('previouslyViewedFiles', []).set([]); |
| 414 } |
| 415 |
| 416 _updateVersionFrom2To3() { |
| 417 WebInspector.settings.createSetting('fileSystemMapping', {}).set({}); |
| 418 WebInspector.settings.createSetting('fileMappingEntries', []).remove(); |
| 419 } |
| 420 |
| 421 _updateVersionFrom3To4() { |
| 422 var advancedMode = WebInspector.settings.createSetting('showHeaSnapshotObjec
tsHiddenProperties', false); |
| 423 WebInspector.moduleSetting('showAdvancedHeapSnapshotProperties').set(advance
dMode.get()); |
| 424 advancedMode.remove(); |
| 425 } |
| 426 |
| 427 _updateVersionFrom4To5() { |
| 428 var settingNames = { |
| 429 'FileSystemViewSidebarWidth': 'fileSystemViewSplitViewState', |
| 430 'elementsSidebarWidth': 'elementsPanelSplitViewState', |
| 431 'StylesPaneSplitRatio': 'stylesPaneSplitViewState', |
| 432 'heapSnapshotRetainersViewSize': 'heapSnapshotSplitViewState', |
| 433 'InspectorView.splitView': 'InspectorView.splitViewState', |
| 434 'InspectorView.screencastSplitView': 'InspectorView.screencastSplitViewSta
te', |
| 435 'Inspector.drawerSplitView': 'Inspector.drawerSplitViewState', |
| 436 'layerDetailsSplitView': 'layerDetailsSplitViewState', |
| 437 'networkSidebarWidth': 'networkPanelSplitViewState', |
| 438 'sourcesSidebarWidth': 'sourcesPanelSplitViewState', |
| 439 'scriptsPanelNavigatorSidebarWidth': 'sourcesPanelNavigatorSplitViewState'
, |
| 440 'sourcesPanelSplitSidebarRatio': 'sourcesPanelDebuggerSidebarSplitViewStat
e', |
| 441 'timeline-details': 'timelinePanelDetailsSplitViewState', |
| 442 'timeline-split': 'timelinePanelRecorsSplitViewState', |
| 443 'timeline-view': 'timelinePanelTimelineStackSplitViewState', |
| 444 'auditsSidebarWidth': 'auditsPanelSplitViewState', |
| 445 'layersSidebarWidth': 'layersPanelSplitViewState', |
| 446 'profilesSidebarWidth': 'profilesPanelSplitViewState', |
| 447 'resourcesSidebarWidth': 'resourcesPanelSplitViewState' |
| 448 }; |
| 449 var empty = {}; |
| 450 for (var oldName in settingNames) { |
| 451 var newName = settingNames[oldName]; |
| 452 var oldNameH = oldName + 'H'; |
| 453 |
| 454 var newValue = null; |
| 455 var oldSetting = WebInspector.settings.createSetting(oldName, empty); |
| 456 if (oldSetting.get() !== empty) { |
| 457 newValue = newValue || {}; |
| 458 newValue.vertical = {}; |
| 459 newValue.vertical.size = oldSetting.get(); |
| 460 oldSetting.remove(); |
| 461 } |
| 462 var oldSettingH = WebInspector.settings.createSetting(oldNameH, empty); |
| 463 if (oldSettingH.get() !== empty) { |
| 464 newValue = newValue || {}; |
| 465 newValue.horizontal = {}; |
| 466 newValue.horizontal.size = oldSettingH.get(); |
| 467 oldSettingH.remove(); |
| 468 } |
| 469 if (newValue) |
| 470 WebInspector.settings.createSetting(newName, {}).set(newValue); |
| 471 } |
| 472 } |
| 473 |
| 474 _updateVersionFrom5To6() { |
| 475 var settingNames = { |
| 476 'debuggerSidebarHidden': 'sourcesPanelSplitViewState', |
| 477 'navigatorHidden': 'sourcesPanelNavigatorSplitViewState', |
| 478 'WebInspector.Drawer.showOnLoad': 'Inspector.drawerSplitViewState' |
| 479 }; |
| 480 |
| 481 for (var oldName in settingNames) { |
| 482 var oldSetting = WebInspector.settings.createSetting(oldName, null); |
| 483 if (oldSetting.get() === null) { |
| 484 oldSetting.remove(); |
| 485 continue; |
| 486 } |
| 487 |
| 488 var newName = settingNames[oldName]; |
| 489 var invert = oldName === 'WebInspector.Drawer.showOnLoad'; |
| 490 var hidden = oldSetting.get() !== invert; |
| 491 oldSetting.remove(); |
| 492 var showMode = hidden ? 'OnlyMain' : 'Both'; |
| 493 |
| 494 var newSetting = WebInspector.settings.createSetting(newName, {}); |
| 495 var newValue = newSetting.get() || {}; |
| 496 newValue.vertical = newValue.vertical || {}; |
| 497 newValue.vertical.showMode = showMode; |
| 498 newValue.horizontal = newValue.horizontal || {}; |
| 499 newValue.horizontal.showMode = showMode; |
| 500 newSetting.set(newValue); |
| 501 } |
| 502 } |
| 503 |
| 504 _updateVersionFrom6To7() { |
| 505 var settingNames = { |
| 506 'sourcesPanelNavigatorSplitViewState': 'sourcesPanelNavigatorSplitViewStat
e', |
| 507 'elementsPanelSplitViewState': 'elementsPanelSplitViewState', |
| 508 'stylesPaneSplitViewState': 'stylesPaneSplitViewState', |
| 509 'sourcesPanelDebuggerSidebarSplitViewState': 'sourcesPanelDebuggerSidebarS
plitViewState' |
| 510 }; |
| 511 |
| 512 var empty = {}; |
| 513 for (var name in settingNames) { |
| 514 var setting = WebInspector.settings.createSetting(name, empty); |
| 515 var value = setting.get(); |
| 516 if (value === empty) |
| 517 continue; |
| 518 // Zero out saved percentage sizes, and they will be restored to defaults. |
| 519 if (value.vertical && value.vertical.size && value.vertical.size < 1) |
| 520 value.vertical.size = 0; |
| 521 if (value.horizontal && value.horizontal.size && value.horizontal.size < 1
) |
| 522 value.horizontal.size = 0; |
| 523 setting.set(value); |
| 524 } |
| 525 } |
| 526 |
| 527 _updateVersionFrom7To8() { |
| 528 } |
| 529 |
| 530 _updateVersionFrom8To9() { |
| 531 var settingNames = ['skipStackFramesPattern', 'workspaceFolderExcludePattern
']; |
| 532 |
| 533 for (var i = 0; i < settingNames.length; ++i) { |
| 534 var setting = WebInspector.settings.createSetting(settingNames[i], ''); |
| 535 var value = setting.get(); |
| 536 if (!value) |
| 537 return; |
| 538 if (typeof value === 'string') |
| 539 value = [value]; |
| 540 for (var j = 0; j < value.length; ++j) { |
| 541 if (typeof value[j] === 'string') |
| 542 value[j] = {pattern: value[j]}; |
| 543 } |
| 544 setting.set(value); |
| 545 } |
| 546 } |
| 547 |
| 548 _updateVersionFrom9To10() { |
| 549 // This one is localStorage specific, which is fine. |
| 550 if (!window.localStorage) |
| 551 return; |
| 552 for (var key in window.localStorage) { |
| 553 if (key.startsWith('revision-history')) |
| 554 window.localStorage.removeItem(key); |
| 555 } |
| 556 } |
| 557 |
| 558 _updateVersionFrom10To11() { |
| 559 var oldSettingName = 'customDevicePresets'; |
| 560 var newSettingName = 'customEmulatedDeviceList'; |
| 561 var oldSetting = WebInspector.settings.createSetting(oldSettingName, undefin
ed); |
| 562 var list = oldSetting.get(); |
| 563 if (!Array.isArray(list)) |
| 564 return; |
| 565 var newList = []; |
| 566 for (var i = 0; i < list.length; ++i) { |
| 567 var value = list[i]; |
| 568 var device = {}; |
| 569 device['title'] = value['title']; |
| 570 device['type'] = 'unknown'; |
| 571 device['user-agent'] = value['userAgent']; |
| 572 device['capabilities'] = []; |
| 573 if (value['touch']) |
| 574 device['capabilities'].push('touch'); |
| 575 if (value['mobile']) |
| 576 device['capabilities'].push('mobile'); |
| 577 device['screen'] = {}; |
| 578 device['screen']['vertical'] = {width: value['width'], height: value['heig
ht']}; |
| 579 device['screen']['horizontal'] = {width: value['height'], height: value['w
idth']}; |
| 580 device['screen']['device-pixel-ratio'] = value['deviceScaleFactor']; |
| 581 device['modes'] = []; |
| 582 device['show-by-default'] = true; |
| 583 device['show'] = 'Default'; |
| 584 newList.push(device); |
| 585 } |
| 586 if (newList.length) |
| 587 WebInspector.settings.createSetting(newSettingName, []).set(newList); |
| 588 oldSetting.remove(); |
| 589 } |
| 590 |
| 591 _updateVersionFrom11To12() { |
| 592 this._migrateSettingsFromLocalStorage(); |
| 593 } |
| 594 |
| 595 _updateVersionFrom12To13() { |
| 596 this._migrateSettingsFromLocalStorage(); |
| 597 WebInspector.settings.createSetting('timelineOverviewMode', '').remove(); |
| 598 } |
| 599 |
| 600 _updateVersionFrom13To14() { |
| 601 var defaultValue = {'throughput': -1, 'latency': 0}; |
| 602 WebInspector.settings.createSetting('networkConditions', defaultValue).set(d
efaultValue); |
| 603 } |
| 604 |
| 605 _updateVersionFrom14To15() { |
| 606 var setting = WebInspector.settings.createLocalSetting('workspaceExcludedFol
ders', {}); |
| 607 var oldValue = setting.get(); |
| 608 var newValue = {}; |
| 609 for (var fileSystemPath in oldValue) { |
| 610 newValue[fileSystemPath] = []; |
| 611 for (var entry of oldValue[fileSystemPath]) |
| 612 newValue[fileSystemPath].push(entry.path); |
| 613 } |
| 614 setting.set(newValue); |
| 615 } |
| 616 |
| 617 _updateVersionFrom15To16() { |
| 618 var setting = WebInspector.settings.createSetting('InspectorView.panelOrder'
, {}); |
| 619 var tabOrders = setting.get(); |
| 620 for (var key of Object.keys(tabOrders)) |
| 621 tabOrders[key] = (tabOrders[key] + 1) * 10; |
| 622 setting.set(tabOrders); |
| 623 } |
| 624 |
| 625 _updateVersionFrom16To17() { |
| 626 var setting = WebInspector.settings.createSetting('networkConditionsCustomPr
ofiles', []); |
| 627 var oldValue = setting.get(); |
| 628 var newValue = []; |
| 629 if (Array.isArray(oldValue)) { |
| 630 for (var preset of oldValue) { |
| 631 if (typeof preset.title === 'string' && typeof preset.value === 'object'
&& |
| 632 typeof preset.value.throughput === 'number' && typeof preset.value.l
atency === 'number') |
| 633 newValue.push({ |
| 634 title: preset.title, |
| 635 value: |
| 636 {download: preset.value.throughput, upload: preset.value.through
put, latency: preset.value.latency} |
| 637 }); |
| 638 } |
| 639 } |
| 640 setting.set(newValue); |
| 641 } |
| 642 |
| 643 _updateVersionFrom17To18() { |
| 644 var setting = WebInspector.settings.createLocalSetting('workspaceExcludedFol
ders', {}); |
| 645 var oldValue = setting.get(); |
| 646 var newValue = {}; |
| 647 for (var oldKey in oldValue) { |
| 648 var newKey = oldKey.replace(/\\/g, '/'); |
| 649 if (!newKey.startsWith('file://')) { |
| 650 if (newKey.startsWith('/')) |
| 651 newKey = 'file://' + newKey; |
| 652 else |
| 653 newKey = 'file:///' + newKey; |
| 654 } |
| 655 newValue[newKey] = oldValue[oldKey]; |
| 656 } |
| 657 setting.set(newValue); |
| 658 } |
| 659 |
| 660 _updateVersionFrom18To19() { |
| 661 var defaultColumns = {status: true, type: true, initiator: true, size: true,
time: true}; |
| 662 var visibleColumnSettings = WebInspector.settings.createSetting('networkLogC
olumnsVisibility', defaultColumns); |
| 663 var visibleColumns = visibleColumnSettings.get(); |
| 664 visibleColumns.name = true; |
| 665 visibleColumns.timeline = true; |
| 666 |
| 667 var configs = {}; |
| 668 for (var columnId in visibleColumns) { |
| 669 if (!visibleColumns.hasOwnProperty(columnId)) |
| 670 continue; |
| 671 configs[columnId.toLowerCase()] = {visible: visibleColumns[columnId]}; |
| 672 } |
| 673 var newSetting = WebInspector.settings.createSetting('networkLogColumns', {}
); |
| 674 newSetting.set(configs); |
| 675 visibleColumnSettings.remove(); |
| 676 } |
| 677 |
| 678 _updateVersionFrom19To20() { |
| 679 var oldSetting = WebInspector.settings.createSetting('InspectorView.panelOrd
er', {}); |
| 680 var newSetting = WebInspector.settings.createSetting('panel-tabOrder', {}); |
| 681 newSetting.set(oldSetting.get()); |
| 682 oldSetting.remove(); |
| 683 } |
| 684 |
| 685 _migrateSettingsFromLocalStorage() { |
| 686 // This step migrates all the settings except for the ones below into the br
owser profile. |
| 687 var localSettings = new Set([ |
| 688 'advancedSearchConfig', 'breakpoints', 'consoleHistory', 'domBreakpoints',
'eventListenerBreakpoints', |
| 689 'fileSystemMapping', 'lastSelectedSourcesSidebarPaneTab', 'previouslyViewe
dFiles', 'savedURLs', |
| 690 'watchExpressions', 'workspaceExcludedFolders', 'xhrBreakpoints' |
| 691 ]); |
| 692 if (!window.localStorage) |
| 693 return; |
| 694 |
| 695 for (var key in window.localStorage) { |
| 696 if (localSettings.has(key)) |
| 697 continue; |
| 698 var value = window.localStorage[key]; |
| 699 window.localStorage.removeItem(key); |
| 700 WebInspector.settings._settingsStorage[key] = value; |
| 701 } |
| 702 } |
| 703 |
| 704 /** |
| 705 * @param {!WebInspector.Setting} breakpointsSetting |
| 706 * @param {number} maxBreakpointsCount |
| 707 */ |
| 708 _clearBreakpointsWhenTooMany(breakpointsSetting, maxBreakpointsCount) { |
| 709 // If there are too many breakpoints in a storage, it is likely due to a rec
ent bug that caused |
| 710 // periodical breakpoints duplication leading to inspector slowness. |
| 711 if (breakpointsSetting.get().length > maxBreakpointsCount) |
| 712 breakpointsSetting.set([]); |
| 713 } |
329 }; | 714 }; |
330 | 715 |
331 WebInspector.RegExpSetting.prototype = { | 716 WebInspector.VersionController._currentVersionName = 'inspectorVersion'; |
332 /** | |
333 * @override | |
334 * @return {string} | |
335 */ | |
336 get: function() | |
337 { | |
338 var result = []; | |
339 var items = this.getAsArray(); | |
340 for (var i = 0; i < items.length; ++i) { | |
341 var item = items[i]; | |
342 if (item.pattern && !item.disabled) | |
343 result.push(item.pattern); | |
344 } | |
345 return result.join("|"); | |
346 }, | |
347 | |
348 /** | |
349 * @return {!Array.<{pattern: string, disabled: (boolean|undefined)}>} | |
350 */ | |
351 getAsArray: function() | |
352 { | |
353 return WebInspector.Setting.prototype.get.call(this); | |
354 }, | |
355 | |
356 /** | |
357 * @override | |
358 * @param {string} value | |
359 */ | |
360 set: function(value) | |
361 { | |
362 this.setAsArray([{ pattern: value }]); | |
363 }, | |
364 | |
365 /** | |
366 * @param {!Array.<{pattern: string, disabled: (boolean|undefined)}>} value | |
367 */ | |
368 setAsArray: function(value) | |
369 { | |
370 delete this._regex; | |
371 WebInspector.Setting.prototype.set.call(this, value); | |
372 }, | |
373 | |
374 /** | |
375 * @return {?RegExp} | |
376 */ | |
377 asRegExp: function() | |
378 { | |
379 if (typeof this._regex !== "undefined") | |
380 return this._regex; | |
381 this._regex = null; | |
382 try { | |
383 var pattern = this.get(); | |
384 if (pattern) | |
385 this._regex = new RegExp(pattern, this._regexFlags || ""); | |
386 } catch (e) { | |
387 } | |
388 return this._regex; | |
389 }, | |
390 | |
391 __proto__: WebInspector.Setting.prototype | |
392 }; | |
393 | |
394 /** | |
395 * @constructor | |
396 */ | |
397 WebInspector.VersionController = function() | |
398 { | |
399 }; | |
400 | |
401 WebInspector.VersionController._currentVersionName = "inspectorVersion"; | |
402 WebInspector.VersionController.currentVersion = 20; | 717 WebInspector.VersionController.currentVersion = 20; |
403 | 718 |
404 WebInspector.VersionController.prototype = { | |
405 updateVersion: function() | |
406 { | |
407 var localStorageVersion = window.localStorage ? window.localStorage[WebI
nspector.VersionController._currentVersionName] : 0; | |
408 var versionSetting = WebInspector.settings.createSetting(WebInspector.Ve
rsionController._currentVersionName, 0); | |
409 var currentVersion = WebInspector.VersionController.currentVersion; | |
410 var oldVersion = versionSetting.get() || parseInt(localStorageVersion ||
"0", 10); | |
411 if (oldVersion === 0) { | |
412 // First run, no need to do anything. | |
413 versionSetting.set(currentVersion); | |
414 return; | |
415 } | |
416 var methodsToRun = this._methodsToRunToUpdateVersion(oldVersion, current
Version); | |
417 for (var i = 0; i < methodsToRun.length; ++i) | |
418 this[methodsToRun[i]].call(this); | |
419 versionSetting.set(currentVersion); | |
420 }, | |
421 | |
422 /** | |
423 * @param {number} oldVersion | |
424 * @param {number} currentVersion | |
425 */ | |
426 _methodsToRunToUpdateVersion: function(oldVersion, currentVersion) | |
427 { | |
428 var result = []; | |
429 for (var i = oldVersion; i < currentVersion; ++i) | |
430 result.push("_updateVersionFrom" + i + "To" + (i + 1)); | |
431 return result; | |
432 }, | |
433 | |
434 _updateVersionFrom0To1: function() | |
435 { | |
436 this._clearBreakpointsWhenTooMany(WebInspector.settings.createLocalSetti
ng("breakpoints", []), 500000); | |
437 }, | |
438 | |
439 _updateVersionFrom1To2: function() | |
440 { | |
441 WebInspector.settings.createSetting("previouslyViewedFiles", []).set([])
; | |
442 }, | |
443 | |
444 _updateVersionFrom2To3: function() | |
445 { | |
446 WebInspector.settings.createSetting("fileSystemMapping", {}).set({}); | |
447 WebInspector.settings.createSetting("fileMappingEntries", []).remove(); | |
448 }, | |
449 | |
450 _updateVersionFrom3To4: function() | |
451 { | |
452 var advancedMode = WebInspector.settings.createSetting("showHeaSnapshotO
bjectsHiddenProperties", false); | |
453 WebInspector.moduleSetting("showAdvancedHeapSnapshotProperties").set(adv
ancedMode.get()); | |
454 advancedMode.remove(); | |
455 }, | |
456 | |
457 _updateVersionFrom4To5: function() | |
458 { | |
459 var settingNames = { | |
460 "FileSystemViewSidebarWidth": "fileSystemViewSplitViewState", | |
461 "elementsSidebarWidth": "elementsPanelSplitViewState", | |
462 "StylesPaneSplitRatio": "stylesPaneSplitViewState", | |
463 "heapSnapshotRetainersViewSize": "heapSnapshotSplitViewState", | |
464 "InspectorView.splitView": "InspectorView.splitViewState", | |
465 "InspectorView.screencastSplitView": "InspectorView.screencastSplitV
iewState", | |
466 "Inspector.drawerSplitView": "Inspector.drawerSplitViewState", | |
467 "layerDetailsSplitView": "layerDetailsSplitViewState", | |
468 "networkSidebarWidth": "networkPanelSplitViewState", | |
469 "sourcesSidebarWidth": "sourcesPanelSplitViewState", | |
470 "scriptsPanelNavigatorSidebarWidth": "sourcesPanelNavigatorSplitView
State", | |
471 "sourcesPanelSplitSidebarRatio": "sourcesPanelDebuggerSidebarSplitVi
ewState", | |
472 "timeline-details": "timelinePanelDetailsSplitViewState", | |
473 "timeline-split": "timelinePanelRecorsSplitViewState", | |
474 "timeline-view": "timelinePanelTimelineStackSplitViewState", | |
475 "auditsSidebarWidth": "auditsPanelSplitViewState", | |
476 "layersSidebarWidth": "layersPanelSplitViewState", | |
477 "profilesSidebarWidth": "profilesPanelSplitViewState", | |
478 "resourcesSidebarWidth": "resourcesPanelSplitViewState" | |
479 }; | |
480 var empty = {}; | |
481 for (var oldName in settingNames) { | |
482 var newName = settingNames[oldName]; | |
483 var oldNameH = oldName + "H"; | |
484 | |
485 var newValue = null; | |
486 var oldSetting = WebInspector.settings.createSetting(oldName, empty)
; | |
487 if (oldSetting.get() !== empty) { | |
488 newValue = newValue || {}; | |
489 newValue.vertical = {}; | |
490 newValue.vertical.size = oldSetting.get(); | |
491 oldSetting.remove(); | |
492 } | |
493 var oldSettingH = WebInspector.settings.createSetting(oldNameH, empt
y); | |
494 if (oldSettingH.get() !== empty) { | |
495 newValue = newValue || {}; | |
496 newValue.horizontal = {}; | |
497 newValue.horizontal.size = oldSettingH.get(); | |
498 oldSettingH.remove(); | |
499 } | |
500 if (newValue) | |
501 WebInspector.settings.createSetting(newName, {}).set(newValue); | |
502 } | |
503 }, | |
504 | |
505 _updateVersionFrom5To6: function() | |
506 { | |
507 var settingNames = { | |
508 "debuggerSidebarHidden": "sourcesPanelSplitViewState", | |
509 "navigatorHidden": "sourcesPanelNavigatorSplitViewState", | |
510 "WebInspector.Drawer.showOnLoad": "Inspector.drawerSplitViewState" | |
511 }; | |
512 | |
513 for (var oldName in settingNames) { | |
514 var oldSetting = WebInspector.settings.createSetting(oldName, null); | |
515 if (oldSetting.get() === null) { | |
516 oldSetting.remove(); | |
517 continue; | |
518 } | |
519 | |
520 var newName = settingNames[oldName]; | |
521 var invert = oldName === "WebInspector.Drawer.showOnLoad"; | |
522 var hidden = oldSetting.get() !== invert; | |
523 oldSetting.remove(); | |
524 var showMode = hidden ? "OnlyMain" : "Both"; | |
525 | |
526 var newSetting = WebInspector.settings.createSetting(newName, {}); | |
527 var newValue = newSetting.get() || {}; | |
528 newValue.vertical = newValue.vertical || {}; | |
529 newValue.vertical.showMode = showMode; | |
530 newValue.horizontal = newValue.horizontal || {}; | |
531 newValue.horizontal.showMode = showMode; | |
532 newSetting.set(newValue); | |
533 } | |
534 }, | |
535 | |
536 _updateVersionFrom6To7: function() | |
537 { | |
538 var settingNames = { | |
539 "sourcesPanelNavigatorSplitViewState": "sourcesPanelNavigatorSplitVi
ewState", | |
540 "elementsPanelSplitViewState": "elementsPanelSplitViewState", | |
541 "stylesPaneSplitViewState": "stylesPaneSplitViewState", | |
542 "sourcesPanelDebuggerSidebarSplitViewState": "sourcesPanelDebuggerSi
debarSplitViewState" | |
543 }; | |
544 | |
545 var empty = {}; | |
546 for (var name in settingNames) { | |
547 var setting = WebInspector.settings.createSetting(name, empty); | |
548 var value = setting.get(); | |
549 if (value === empty) | |
550 continue; | |
551 // Zero out saved percentage sizes, and they will be restored to def
aults. | |
552 if (value.vertical && value.vertical.size && value.vertical.size < 1
) | |
553 value.vertical.size = 0; | |
554 if (value.horizontal && value.horizontal.size && value.horizontal.si
ze < 1) | |
555 value.horizontal.size = 0; | |
556 setting.set(value); | |
557 } | |
558 }, | |
559 | |
560 _updateVersionFrom7To8: function() | |
561 { | |
562 }, | |
563 | |
564 _updateVersionFrom8To9: function() | |
565 { | |
566 var settingNames = [ | |
567 "skipStackFramesPattern", | |
568 "workspaceFolderExcludePattern" | |
569 ]; | |
570 | |
571 for (var i = 0; i < settingNames.length; ++i) { | |
572 var setting = WebInspector.settings.createSetting(settingNames[i], "
"); | |
573 var value = setting.get(); | |
574 if (!value) | |
575 return; | |
576 if (typeof value === "string") | |
577 value = [value]; | |
578 for (var j = 0; j < value.length; ++j) { | |
579 if (typeof value[j] === "string") | |
580 value[j] = { pattern: value[j] }; | |
581 } | |
582 setting.set(value); | |
583 } | |
584 }, | |
585 | |
586 _updateVersionFrom9To10: function() | |
587 { | |
588 // This one is localStorage specific, which is fine. | |
589 if (!window.localStorage) | |
590 return; | |
591 for (var key in window.localStorage) { | |
592 if (key.startsWith("revision-history")) | |
593 window.localStorage.removeItem(key); | |
594 } | |
595 }, | |
596 | |
597 _updateVersionFrom10To11: function() | |
598 { | |
599 var oldSettingName = "customDevicePresets"; | |
600 var newSettingName = "customEmulatedDeviceList"; | |
601 var oldSetting = WebInspector.settings.createSetting(oldSettingName, und
efined); | |
602 var list = oldSetting.get(); | |
603 if (!Array.isArray(list)) | |
604 return; | |
605 var newList = []; | |
606 for (var i = 0; i < list.length; ++i) { | |
607 var value = list[i]; | |
608 var device = {}; | |
609 device["title"] = value["title"]; | |
610 device["type"] = "unknown"; | |
611 device["user-agent"] = value["userAgent"]; | |
612 device["capabilities"] = []; | |
613 if (value["touch"]) | |
614 device["capabilities"].push("touch"); | |
615 if (value["mobile"]) | |
616 device["capabilities"].push("mobile"); | |
617 device["screen"] = {}; | |
618 device["screen"]["vertical"] = {width: value["width"], height: value
["height"]}; | |
619 device["screen"]["horizontal"] = {width: value["height"], height: va
lue["width"]}; | |
620 device["screen"]["device-pixel-ratio"] = value["deviceScaleFactor"]; | |
621 device["modes"] = []; | |
622 device["show-by-default"] = true; | |
623 device["show"] = "Default"; | |
624 newList.push(device); | |
625 } | |
626 if (newList.length) | |
627 WebInspector.settings.createSetting(newSettingName, []).set(newList)
; | |
628 oldSetting.remove(); | |
629 }, | |
630 | |
631 _updateVersionFrom11To12: function() | |
632 { | |
633 this._migrateSettingsFromLocalStorage(); | |
634 }, | |
635 | |
636 _updateVersionFrom12To13: function() | |
637 { | |
638 this._migrateSettingsFromLocalStorage(); | |
639 WebInspector.settings.createSetting("timelineOverviewMode", "").remove()
; | |
640 }, | |
641 | |
642 _updateVersionFrom13To14: function() | |
643 { | |
644 var defaultValue = { "throughput": -1, "latency": 0 }; | |
645 WebInspector.settings.createSetting("networkConditions", defaultValue).s
et(defaultValue); | |
646 }, | |
647 | |
648 _updateVersionFrom14To15: function() | |
649 { | |
650 var setting = WebInspector.settings.createLocalSetting("workspaceExclude
dFolders", {}); | |
651 var oldValue = setting.get(); | |
652 var newValue = {}; | |
653 for (var fileSystemPath in oldValue) { | |
654 newValue[fileSystemPath] = []; | |
655 for (var entry of oldValue[fileSystemPath]) | |
656 newValue[fileSystemPath].push(entry.path); | |
657 } | |
658 setting.set(newValue); | |
659 }, | |
660 | |
661 _updateVersionFrom15To16: function() | |
662 { | |
663 var setting = WebInspector.settings.createSetting("InspectorView.panelOr
der", {}); | |
664 var tabOrders = setting.get(); | |
665 for (var key of Object.keys(tabOrders)) | |
666 tabOrders[key] = (tabOrders[key] + 1) * 10; | |
667 setting.set(tabOrders); | |
668 }, | |
669 | |
670 _updateVersionFrom16To17: function() | |
671 { | |
672 var setting = WebInspector.settings.createSetting("networkConditionsCust
omProfiles", []); | |
673 var oldValue = setting.get(); | |
674 var newValue = []; | |
675 if (Array.isArray(oldValue)) { | |
676 for (var preset of oldValue) { | |
677 if (typeof preset.title === "string" && typeof preset.value ===
"object" && typeof preset.value.throughput === "number" && typeof preset.value.l
atency === "number") | |
678 newValue.push({title: preset.title, value: {download: preset
.value.throughput, upload: preset.value.throughput, latency: preset.value.latenc
y}}); | |
679 } | |
680 } | |
681 setting.set(newValue); | |
682 }, | |
683 | |
684 _updateVersionFrom17To18: function() | |
685 { | |
686 var setting = WebInspector.settings.createLocalSetting("workspaceExclude
dFolders", {}); | |
687 var oldValue = setting.get(); | |
688 var newValue = {}; | |
689 for (var oldKey in oldValue) { | |
690 var newKey = oldKey.replace(/\\/g, "/"); | |
691 if (!newKey.startsWith("file://")) { | |
692 if (newKey.startsWith("/")) | |
693 newKey = "file://" + newKey; | |
694 else | |
695 newKey = "file:///" + newKey; | |
696 } | |
697 newValue[newKey] = oldValue[oldKey]; | |
698 } | |
699 setting.set(newValue); | |
700 }, | |
701 | |
702 _updateVersionFrom18To19: function() | |
703 { | |
704 var defaultColumns = { | |
705 status: true, | |
706 type: true, | |
707 initiator: true, | |
708 size: true, | |
709 time: true | |
710 }; | |
711 var visibleColumnSettings = WebInspector.settings.createSetting("network
LogColumnsVisibility", defaultColumns); | |
712 var visibleColumns = visibleColumnSettings.get(); | |
713 visibleColumns.name = true; | |
714 visibleColumns.timeline = true; | |
715 | |
716 var configs = {}; | |
717 for (var columnId in visibleColumns) { | |
718 if (!visibleColumns.hasOwnProperty(columnId)) | |
719 continue; | |
720 configs[columnId.toLowerCase()] = { | |
721 visible: visibleColumns[columnId] | |
722 }; | |
723 } | |
724 var newSetting = WebInspector.settings.createSetting("networkLogColumns"
, {}); | |
725 newSetting.set(configs); | |
726 visibleColumnSettings.remove(); | |
727 }, | |
728 | |
729 _updateVersionFrom19To20: function() | |
730 { | |
731 var oldSetting = WebInspector.settings.createSetting("InspectorView.pane
lOrder", {}); | |
732 var newSetting = WebInspector.settings.createSetting("panel-tabOrder", {
}); | |
733 newSetting.set(oldSetting.get()); | |
734 oldSetting.remove(); | |
735 }, | |
736 | |
737 _migrateSettingsFromLocalStorage: function() | |
738 { | |
739 // This step migrates all the settings except for the ones below into th
e browser profile. | |
740 var localSettings = new Set([ "advancedSearchConfig", "breakpoints", "co
nsoleHistory", "domBreakpoints", "eventListenerBreakpoints", | |
741 "fileSystemMapping", "lastSelectedSourcesSidebarPa
neTab", "previouslyViewedFiles", | |
742 "savedURLs", "watchExpressions", "workspaceExclude
dFolders", "xhrBreakpoints" ]); | |
743 if (!window.localStorage) | |
744 return; | |
745 | |
746 for (var key in window.localStorage) { | |
747 if (localSettings.has(key)) | |
748 continue; | |
749 var value = window.localStorage[key]; | |
750 window.localStorage.removeItem(key); | |
751 WebInspector.settings._settingsStorage[key] = value; | |
752 } | |
753 }, | |
754 | |
755 /** | |
756 * @param {!WebInspector.Setting} breakpointsSetting | |
757 * @param {number} maxBreakpointsCount | |
758 */ | |
759 _clearBreakpointsWhenTooMany: function(breakpointsSetting, maxBreakpointsCou
nt) | |
760 { | |
761 // If there are too many breakpoints in a storage, it is likely due to a
recent bug that caused | |
762 // periodical breakpoints duplication leading to inspector slowness. | |
763 if (breakpointsSetting.get().length > maxBreakpointsCount) | |
764 breakpointsSetting.set([]); | |
765 } | |
766 }; | |
767 | |
768 /** | 719 /** |
769 * @type {!WebInspector.Settings} | 720 * @type {!WebInspector.Settings} |
770 */ | 721 */ |
771 WebInspector.settings; | 722 WebInspector.settings; |
772 | 723 |
773 /** | 724 /** |
774 * @param {string} settingName | 725 * @param {string} settingName |
775 * @return {!WebInspector.Setting} | 726 * @return {!WebInspector.Setting} |
776 */ | 727 */ |
777 WebInspector.moduleSetting = function(settingName) | 728 WebInspector.moduleSetting = function(settingName) { |
778 { | 729 return WebInspector.settings.moduleSetting(settingName); |
779 return WebInspector.settings.moduleSetting(settingName); | |
780 }; | 730 }; |
781 | 731 |
782 /** | 732 /** |
783 * @param {string} settingName | 733 * @param {string} settingName |
784 * @return {!WebInspector.Setting} | 734 * @return {!WebInspector.Setting} |
785 */ | 735 */ |
786 WebInspector.settingForTest = function(settingName) | 736 WebInspector.settingForTest = function(settingName) { |
787 { | 737 return WebInspector.settings.settingForTest(settingName); |
788 return WebInspector.settings.settingForTest(settingName); | |
789 }; | 738 }; |
OLD | NEW |