| 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 |