| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 /** | 4 /** |
| 5 * @unrestricted | 5 * @unrestricted |
| 6 */ | 6 */ |
| 7 WebInspector.CSSProperty = class { | 7 SDK.CSSProperty = class { |
| 8 /** | 8 /** |
| 9 * @param {!WebInspector.CSSStyleDeclaration} ownerStyle | 9 * @param {!SDK.CSSStyleDeclaration} ownerStyle |
| 10 * @param {number} index | 10 * @param {number} index |
| 11 * @param {string} name | 11 * @param {string} name |
| 12 * @param {string} value | 12 * @param {string} value |
| 13 * @param {boolean} important | 13 * @param {boolean} important |
| 14 * @param {boolean} disabled | 14 * @param {boolean} disabled |
| 15 * @param {boolean} parsedOk | 15 * @param {boolean} parsedOk |
| 16 * @param {boolean} implicit | 16 * @param {boolean} implicit |
| 17 * @param {?string=} text | 17 * @param {?string=} text |
| 18 * @param {!Protocol.CSS.SourceRange=} range | 18 * @param {!Protocol.CSS.SourceRange=} range |
| 19 */ | 19 */ |
| 20 constructor(ownerStyle, index, name, value, important, disabled, parsedOk, imp
licit, text, range) { | 20 constructor(ownerStyle, index, name, value, important, disabled, parsedOk, imp
licit, text, range) { |
| 21 this.ownerStyle = ownerStyle; | 21 this.ownerStyle = ownerStyle; |
| 22 this.index = index; | 22 this.index = index; |
| 23 this.name = name; | 23 this.name = name; |
| 24 this.value = value; | 24 this.value = value; |
| 25 this.important = important; | 25 this.important = important; |
| 26 this.disabled = disabled; | 26 this.disabled = disabled; |
| 27 this.parsedOk = parsedOk; | 27 this.parsedOk = parsedOk; |
| 28 this.implicit = implicit; // A longhand, implicitly set by missing values o
f shorthand. | 28 this.implicit = implicit; // A longhand, implicitly set by missing values o
f shorthand. |
| 29 this.text = text; | 29 this.text = text; |
| 30 this.range = range ? WebInspector.TextRange.fromObject(range) : null; | 30 this.range = range ? Common.TextRange.fromObject(range) : null; |
| 31 this._active = true; | 31 this._active = true; |
| 32 this._nameRange = null; | 32 this._nameRange = null; |
| 33 this._valueRange = null; | 33 this._valueRange = null; |
| 34 } | 34 } |
| 35 | 35 |
| 36 /** | 36 /** |
| 37 * @param {!WebInspector.CSSStyleDeclaration} ownerStyle | 37 * @param {!SDK.CSSStyleDeclaration} ownerStyle |
| 38 * @param {number} index | 38 * @param {number} index |
| 39 * @param {!Protocol.CSS.CSSProperty} payload | 39 * @param {!Protocol.CSS.CSSProperty} payload |
| 40 * @return {!WebInspector.CSSProperty} | 40 * @return {!SDK.CSSProperty} |
| 41 */ | 41 */ |
| 42 static parsePayload(ownerStyle, index, payload) { | 42 static parsePayload(ownerStyle, index, payload) { |
| 43 // The following default field values are used in the payload: | 43 // The following default field values are used in the payload: |
| 44 // important: false | 44 // important: false |
| 45 // parsedOk: true | 45 // parsedOk: true |
| 46 // implicit: false | 46 // implicit: false |
| 47 // disabled: false | 47 // disabled: false |
| 48 var result = new WebInspector.CSSProperty( | 48 var result = new SDK.CSSProperty( |
| 49 ownerStyle, index, payload.name, payload.value, payload.important || fal
se, payload.disabled || false, | 49 ownerStyle, index, payload.name, payload.value, payload.important || fal
se, payload.disabled || false, |
| 50 ('parsedOk' in payload) ? !!payload.parsedOk : true, !!payload.implicit,
payload.text, payload.range); | 50 ('parsedOk' in payload) ? !!payload.parsedOk : true, !!payload.implicit,
payload.text, payload.range); |
| 51 return result; | 51 return result; |
| 52 } | 52 } |
| 53 | 53 |
| 54 _ensureRanges() { | 54 _ensureRanges() { |
| 55 if (this._nameRange && this._valueRange) | 55 if (this._nameRange && this._valueRange) |
| 56 return; | 56 return; |
| 57 var range = this.range; | 57 var range = this.range; |
| 58 var text = this.text ? new WebInspector.Text(this.text) : null; | 58 var text = this.text ? new Common.Text(this.text) : null; |
| 59 if (!range || !text) | 59 if (!range || !text) |
| 60 return; | 60 return; |
| 61 | 61 |
| 62 var nameIndex = text.value().indexOf(this.name); | 62 var nameIndex = text.value().indexOf(this.name); |
| 63 var valueIndex = text.value().lastIndexOf(this.value); | 63 var valueIndex = text.value().lastIndexOf(this.value); |
| 64 if (nameIndex === -1 || valueIndex === -1 || nameIndex > valueIndex) | 64 if (nameIndex === -1 || valueIndex === -1 || nameIndex > valueIndex) |
| 65 return; | 65 return; |
| 66 | 66 |
| 67 var nameSourceRange = new WebInspector.SourceRange(nameIndex, this.name.leng
th); | 67 var nameSourceRange = new Common.SourceRange(nameIndex, this.name.length); |
| 68 var valueSourceRange = new WebInspector.SourceRange(valueIndex, this.value.l
ength); | 68 var valueSourceRange = new Common.SourceRange(valueIndex, this.value.length)
; |
| 69 | 69 |
| 70 this._nameRange = rebase(text.toTextRange(nameSourceRange), range.startLine,
range.startColumn); | 70 this._nameRange = rebase(text.toTextRange(nameSourceRange), range.startLine,
range.startColumn); |
| 71 this._valueRange = rebase(text.toTextRange(valueSourceRange), range.startLin
e, range.startColumn); | 71 this._valueRange = rebase(text.toTextRange(valueSourceRange), range.startLin
e, range.startColumn); |
| 72 | 72 |
| 73 /** | 73 /** |
| 74 * @param {!WebInspector.TextRange} oneLineRange | 74 * @param {!Common.TextRange} oneLineRange |
| 75 * @param {number} lineOffset | 75 * @param {number} lineOffset |
| 76 * @param {number} columnOffset | 76 * @param {number} columnOffset |
| 77 * @return {!WebInspector.TextRange} | 77 * @return {!Common.TextRange} |
| 78 */ | 78 */ |
| 79 function rebase(oneLineRange, lineOffset, columnOffset) { | 79 function rebase(oneLineRange, lineOffset, columnOffset) { |
| 80 if (oneLineRange.startLine === 0) { | 80 if (oneLineRange.startLine === 0) { |
| 81 oneLineRange.startColumn += columnOffset; | 81 oneLineRange.startColumn += columnOffset; |
| 82 oneLineRange.endColumn += columnOffset; | 82 oneLineRange.endColumn += columnOffset; |
| 83 } | 83 } |
| 84 oneLineRange.startLine += lineOffset; | 84 oneLineRange.startLine += lineOffset; |
| 85 oneLineRange.endLine += lineOffset; | 85 oneLineRange.endLine += lineOffset; |
| 86 return oneLineRange; | 86 return oneLineRange; |
| 87 } | 87 } |
| 88 } | 88 } |
| 89 | 89 |
| 90 /** | 90 /** |
| 91 * @return {?WebInspector.TextRange} | 91 * @return {?Common.TextRange} |
| 92 */ | 92 */ |
| 93 nameRange() { | 93 nameRange() { |
| 94 this._ensureRanges(); | 94 this._ensureRanges(); |
| 95 return this._nameRange; | 95 return this._nameRange; |
| 96 } | 96 } |
| 97 | 97 |
| 98 /** | 98 /** |
| 99 * @return {?WebInspector.TextRange} | 99 * @return {?Common.TextRange} |
| 100 */ | 100 */ |
| 101 valueRange() { | 101 valueRange() { |
| 102 this._ensureRanges(); | 102 this._ensureRanges(); |
| 103 return this._valueRange; | 103 return this._valueRange; |
| 104 } | 104 } |
| 105 | 105 |
| 106 /** | 106 /** |
| 107 * @param {!WebInspector.CSSModel.Edit} edit | 107 * @param {!SDK.CSSModel.Edit} edit |
| 108 */ | 108 */ |
| 109 rebase(edit) { | 109 rebase(edit) { |
| 110 if (this.ownerStyle.styleSheetId !== edit.styleSheetId) | 110 if (this.ownerStyle.styleSheetId !== edit.styleSheetId) |
| 111 return; | 111 return; |
| 112 if (this.range) | 112 if (this.range) |
| 113 this.range = this.range.rebaseAfterTextEdit(edit.oldRange, edit.newRange); | 113 this.range = this.range.rebaseAfterTextEdit(edit.oldRange, edit.newRange); |
| 114 } | 114 } |
| 115 | 115 |
| 116 /** | 116 /** |
| 117 * @param {boolean} active | 117 * @param {boolean} active |
| (...skipping 28 matching lines...) Expand all Loading... |
| 146 if (!this.ownerStyle) | 146 if (!this.ownerStyle) |
| 147 return Promise.reject(new Error('No ownerStyle for property')); | 147 return Promise.reject(new Error('No ownerStyle for property')); |
| 148 | 148 |
| 149 if (!this.ownerStyle.styleSheetId) | 149 if (!this.ownerStyle.styleSheetId) |
| 150 return Promise.reject(new Error('No owner style id')); | 150 return Promise.reject(new Error('No owner style id')); |
| 151 | 151 |
| 152 if (!this.range || !this.ownerStyle.range) | 152 if (!this.range || !this.ownerStyle.range) |
| 153 return Promise.reject(new Error('Style not editable')); | 153 return Promise.reject(new Error('Style not editable')); |
| 154 | 154 |
| 155 if (majorChange) | 155 if (majorChange) |
| 156 WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.Style
RuleEdited); | 156 Host.userMetrics.actionTaken(Host.UserMetrics.Action.StyleRuleEdited); |
| 157 | 157 |
| 158 if (overwrite && propertyText === this.propertyText) { | 158 if (overwrite && propertyText === this.propertyText) { |
| 159 if (majorChange) | 159 if (majorChange) |
| 160 this.ownerStyle.cssModel().domModel().markUndoableState(); | 160 this.ownerStyle.cssModel().domModel().markUndoableState(); |
| 161 return Promise.resolve(true); | 161 return Promise.resolve(true); |
| 162 } | 162 } |
| 163 | 163 |
| 164 var range = this.range.relativeTo(this.ownerStyle.range.startLine, this.owne
rStyle.range.startColumn); | 164 var range = this.range.relativeTo(this.ownerStyle.range.startLine, this.owne
rStyle.range.startColumn); |
| 165 var indentation = this.ownerStyle.cssText ? this._detectIndentation(this.own
erStyle.cssText) : | 165 var indentation = this.ownerStyle.cssText ? this._detectIndentation(this.own
erStyle.cssText) : |
| 166 WebInspector.moduleSetting('text
EditorIndent').get(); | 166 Common.moduleSetting('textEditor
Indent').get(); |
| 167 var endIndentation = this.ownerStyle.cssText ? indentation.substring(0, this
.ownerStyle.range.endColumn) : ''; | 167 var endIndentation = this.ownerStyle.cssText ? indentation.substring(0, this
.ownerStyle.range.endColumn) : ''; |
| 168 var text = new WebInspector.Text(this.ownerStyle.cssText || ''); | 168 var text = new Common.Text(this.ownerStyle.cssText || ''); |
| 169 var newStyleText = text.replaceRange(range, String.sprintf(';%s;', propertyT
ext)); | 169 var newStyleText = text.replaceRange(range, String.sprintf(';%s;', propertyT
ext)); |
| 170 | 170 |
| 171 return self.runtime.extension(WebInspector.TokenizerFactory) | 171 return self.runtime.extension(Common.TokenizerFactory) |
| 172 .instance() | 172 .instance() |
| 173 .then(this._formatStyle.bind(this, newStyleText, indentation, endIndenta
tion)) | 173 .then(this._formatStyle.bind(this, newStyleText, indentation, endIndenta
tion)) |
| 174 .then(setStyleText.bind(this)); | 174 .then(setStyleText.bind(this)); |
| 175 | 175 |
| 176 /** | 176 /** |
| 177 * @param {string} styleText | 177 * @param {string} styleText |
| 178 * @this {WebInspector.CSSProperty} | 178 * @this {SDK.CSSProperty} |
| 179 * @return {!Promise.<boolean>} | 179 * @return {!Promise.<boolean>} |
| 180 */ | 180 */ |
| 181 function setStyleText(styleText) { | 181 function setStyleText(styleText) { |
| 182 return this.ownerStyle.setText(styleText, majorChange); | 182 return this.ownerStyle.setText(styleText, majorChange); |
| 183 } | 183 } |
| 184 } | 184 } |
| 185 | 185 |
| 186 /** | 186 /** |
| 187 * @param {string} styleText | 187 * @param {string} styleText |
| 188 * @param {string} indentation | 188 * @param {string} indentation |
| 189 * @param {string} endIndentation | 189 * @param {string} endIndentation |
| 190 * @param {!WebInspector.TokenizerFactory} tokenizerFactory | 190 * @param {!Common.TokenizerFactory} tokenizerFactory |
| 191 * @return {string} | 191 * @return {string} |
| 192 */ | 192 */ |
| 193 _formatStyle(styleText, indentation, endIndentation, tokenizerFactory) { | 193 _formatStyle(styleText, indentation, endIndentation, tokenizerFactory) { |
| 194 if (indentation) | 194 if (indentation) |
| 195 indentation = '\n' + indentation; | 195 indentation = '\n' + indentation; |
| 196 var result = ''; | 196 var result = ''; |
| 197 var propertyText; | 197 var propertyText; |
| 198 var insideProperty = false; | 198 var insideProperty = false; |
| 199 var tokenize = tokenizerFactory.createTokenizer('text/css'); | 199 var tokenize = tokenizerFactory.createTokenizer('text/css'); |
| 200 | 200 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 | 238 |
| 239 /** | 239 /** |
| 240 * @param {string} text | 240 * @param {string} text |
| 241 * @return {boolean} | 241 * @return {boolean} |
| 242 */ | 242 */ |
| 243 function isDisabledProperty(text) { | 243 function isDisabledProperty(text) { |
| 244 var colon = text.indexOf(':'); | 244 var colon = text.indexOf(':'); |
| 245 if (colon === -1) | 245 if (colon === -1) |
| 246 return false; | 246 return false; |
| 247 var propertyName = text.substring(2, colon).trim(); | 247 var propertyName = text.substring(2, colon).trim(); |
| 248 return WebInspector.cssMetadata().isCSSPropertyName(propertyName); | 248 return SDK.cssMetadata().isCSSPropertyName(propertyName); |
| 249 } | 249 } |
| 250 } | 250 } |
| 251 | 251 |
| 252 /** | 252 /** |
| 253 * @param {string} text | 253 * @param {string} text |
| 254 * @return {string} | 254 * @return {string} |
| 255 */ | 255 */ |
| 256 _detectIndentation(text) { | 256 _detectIndentation(text) { |
| 257 var lines = text.split('\n'); | 257 var lines = text.split('\n'); |
| 258 if (lines.length < 2) | 258 if (lines.length < 2) |
| 259 return ''; | 259 return ''; |
| 260 return WebInspector.TextUtils.lineIndent(lines[1]); | 260 return Common.TextUtils.lineIndent(lines[1]); |
| 261 } | 261 } |
| 262 | 262 |
| 263 /** | 263 /** |
| 264 * @param {string} newValue | 264 * @param {string} newValue |
| 265 * @param {boolean} majorChange | 265 * @param {boolean} majorChange |
| 266 * @param {boolean} overwrite | 266 * @param {boolean} overwrite |
| 267 * @param {function(boolean)=} userCallback | 267 * @param {function(boolean)=} userCallback |
| 268 */ | 268 */ |
| 269 setValue(newValue, majorChange, overwrite, userCallback) { | 269 setValue(newValue, majorChange, overwrite, userCallback) { |
| 270 var text = this.name + ': ' + newValue + (this.important ? ' !important' : '
') + ';'; | 270 var text = this.name + ': ' + newValue + (this.important ? ' !important' : '
') + ';'; |
| 271 this.setText(text, majorChange, overwrite).then(userCallback); | 271 this.setText(text, majorChange, overwrite).then(userCallback); |
| 272 } | 272 } |
| 273 | 273 |
| 274 /** | 274 /** |
| 275 * @param {boolean} disabled | 275 * @param {boolean} disabled |
| 276 * @return {!Promise.<boolean>} | 276 * @return {!Promise.<boolean>} |
| 277 */ | 277 */ |
| 278 setDisabled(disabled) { | 278 setDisabled(disabled) { |
| 279 if (!this.ownerStyle) | 279 if (!this.ownerStyle) |
| 280 return Promise.resolve(false); | 280 return Promise.resolve(false); |
| 281 if (disabled === this.disabled) | 281 if (disabled === this.disabled) |
| 282 return Promise.resolve(true); | 282 return Promise.resolve(true); |
| 283 var propertyText = this.text.trim(); | 283 var propertyText = this.text.trim(); |
| 284 var text = disabled ? '/* ' + propertyText + ' */' : this.text.substring(2,
propertyText.length - 2).trim(); | 284 var text = disabled ? '/* ' + propertyText + ' */' : this.text.substring(2,
propertyText.length - 2).trim(); |
| 285 return this.setText(text, true, true); | 285 return this.setText(text, true, true); |
| 286 } | 286 } |
| 287 }; | 287 }; |
| OLD | NEW |