| 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 SDK.CSSProperty = class { | 7 SDK.CSSProperty = class { |
| 8 /** | 8 /** |
| 9 * @param {!SDK.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 ? Common.TextRange.fromObject(range) : null; | 30 this.range = range ? TextUtils.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 {!SDK.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 {!SDK.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 SDK.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 Common.Text(this.text) : null; | 58 var text = this.text ? new TextUtils.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 Common.SourceRange(nameIndex, this.name.length); | 67 var nameSourceRange = new TextUtils.SourceRange(nameIndex, this.name.length)
; |
| 68 var valueSourceRange = new Common.SourceRange(valueIndex, this.value.length)
; | 68 var valueSourceRange = new TextUtils.SourceRange(valueIndex, this.value.leng
th); |
| 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 {!Common.TextRange} oneLineRange | 74 * @param {!TextUtils.TextRange} oneLineRange |
| 75 * @param {number} lineOffset | 75 * @param {number} lineOffset |
| 76 * @param {number} columnOffset | 76 * @param {number} columnOffset |
| 77 * @return {!Common.TextRange} | 77 * @return {!TextUtils.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 {?Common.TextRange} | 91 * @return {?TextUtils.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 {?Common.TextRange} | 99 * @return {?TextUtils.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 {!SDK.CSSModel.Edit} edit | 107 * @param {!SDK.CSSModel.Edit} edit |
| 108 */ | 108 */ |
| 109 rebase(edit) { | 109 rebase(edit) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Common.moduleSetting('textEditor
Indent').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 Common.Text(this.ownerStyle.cssText || ''); | 168 var text = new TextUtils.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(Common.TokenizerFactory) | 171 return self.runtime.extension(TextUtils.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 {SDK.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 {!Common.TokenizerFactory} tokenizerFactory | 190 * @param {!TextUtils.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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Common.TextUtils.lineIndent(lines[1]); | 260 return TextUtils.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 |