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 /** | 5 * @unrestricted |
6 * @constructor | 6 */ |
7 * @param {!CSSAgent.Value} payload | 7 WebInspector.CSSValue = class { |
8 */ | 8 /** |
9 WebInspector.CSSValue = function(payload) | 9 * @param {!CSSAgent.Value} payload |
10 { | 10 */ |
| 11 constructor(payload) { |
11 this.text = payload.text; | 12 this.text = payload.text; |
12 if (payload.range) | 13 if (payload.range) |
13 this.range = WebInspector.TextRange.fromObject(payload.range); | 14 this.range = WebInspector.TextRange.fromObject(payload.range); |
14 }; | 15 } |
15 | 16 |
16 WebInspector.CSSValue.prototype = { | 17 /** |
17 /** | 18 * @param {!WebInspector.CSSModel.Edit} edit |
18 * @param {!WebInspector.CSSModel.Edit} edit | 19 */ |
19 */ | 20 rebase(edit) { |
20 rebase: function(edit) | 21 if (!this.range) |
21 { | 22 return; |
22 if (!this.range) | 23 this.range = this.range.rebaseAfterTextEdit(edit.oldRange, edit.newRange); |
23 return; | 24 } |
24 this.range = this.range.rebaseAfterTextEdit(edit.oldRange, edit.newRange
); | 25 }; |
25 } | 26 |
26 }; | 27 /** |
27 | 28 * @unrestricted |
28 /** | 29 */ |
29 * @constructor | 30 WebInspector.CSSRule = class { |
30 * @param {!WebInspector.CSSModel} cssModel | 31 /** |
31 * @param {{style: !CSSAgent.CSSStyle, styleSheetId: (string|undefined), origin:
!CSSAgent.StyleSheetOrigin}} payload | 32 * @param {!WebInspector.CSSModel} cssModel |
32 */ | 33 * @param {{style: !CSSAgent.CSSStyle, styleSheetId: (string|undefined), origi
n: !CSSAgent.StyleSheetOrigin}} payload |
33 WebInspector.CSSRule = function(cssModel, payload) | 34 */ |
34 { | 35 constructor(cssModel, payload) { |
35 this._cssModel = cssModel; | 36 this._cssModel = cssModel; |
36 this.styleSheetId = payload.styleSheetId; | 37 this.styleSheetId = payload.styleSheetId; |
37 | 38 |
38 if (this.styleSheetId) { | 39 if (this.styleSheetId) { |
39 var styleSheetHeader = cssModel.styleSheetHeaderForId(this.styleSheetId)
; | 40 var styleSheetHeader = cssModel.styleSheetHeaderForId(this.styleSheetId); |
40 this.sourceURL = styleSheetHeader.sourceURL; | 41 this.sourceURL = styleSheetHeader.sourceURL; |
41 } | 42 } |
42 this.origin = payload.origin; | 43 this.origin = payload.origin; |
43 this.style = new WebInspector.CSSStyleDeclaration(this._cssModel, this, payl
oad.style, WebInspector.CSSStyleDeclaration.Type.Regular); | 44 this.style = new WebInspector.CSSStyleDeclaration( |
44 }; | 45 this._cssModel, this, payload.style, WebInspector.CSSStyleDeclaration.Ty
pe.Regular); |
45 | 46 } |
46 WebInspector.CSSRule.prototype = { | 47 |
47 /** | 48 /** |
48 * @param {!WebInspector.CSSModel.Edit} edit | 49 * @param {!WebInspector.CSSModel.Edit} edit |
49 */ | 50 */ |
50 rebase: function(edit) | 51 rebase(edit) { |
51 { | 52 if (this.styleSheetId !== edit.styleSheetId) |
52 if (this.styleSheetId !== edit.styleSheetId) | 53 return; |
53 return; | 54 this.style.rebase(edit); |
54 this.style.rebase(edit); | 55 } |
55 }, | 56 |
56 | 57 /** |
57 /** | 58 * @return {string} |
58 * @return {string} | 59 */ |
59 */ | 60 resourceURL() { |
60 resourceURL: function() | 61 if (!this.styleSheetId) |
61 { | 62 return ''; |
62 if (!this.styleSheetId) | 63 var styleSheetHeader = this._cssModel.styleSheetHeaderForId(this.styleSheetI
d); |
63 return ""; | 64 return styleSheetHeader.resourceURL(); |
64 var styleSheetHeader = this._cssModel.styleSheetHeaderForId(this.styleSh
eetId); | 65 } |
65 return styleSheetHeader.resourceURL(); | 66 |
66 }, | 67 /** |
67 | 68 * @return {boolean} |
68 /** | 69 */ |
69 * @return {boolean} | 70 isUserAgent() { |
70 */ | 71 return this.origin === CSSAgent.StyleSheetOrigin.UserAgent; |
71 isUserAgent: function() | 72 } |
72 { | 73 |
73 return this.origin === CSSAgent.StyleSheetOrigin.UserAgent; | 74 /** |
74 }, | 75 * @return {boolean} |
75 | 76 */ |
76 /** | 77 isInjected() { |
77 * @return {boolean} | 78 return this.origin === CSSAgent.StyleSheetOrigin.Injected; |
78 */ | 79 } |
79 isInjected: function() | 80 |
80 { | 81 /** |
81 return this.origin === CSSAgent.StyleSheetOrigin.Injected; | 82 * @return {boolean} |
82 }, | 83 */ |
83 | 84 isViaInspector() { |
84 /** | 85 return this.origin === CSSAgent.StyleSheetOrigin.Inspector; |
85 * @return {boolean} | 86 } |
86 */ | 87 |
87 isViaInspector: function() | 88 /** |
88 { | 89 * @return {boolean} |
89 return this.origin === CSSAgent.StyleSheetOrigin.Inspector; | 90 */ |
90 }, | 91 isRegular() { |
91 | 92 return this.origin === CSSAgent.StyleSheetOrigin.Regular; |
92 /** | 93 } |
93 * @return {boolean} | 94 }; |
94 */ | 95 |
95 isRegular: function() | 96 /** |
96 { | 97 * @unrestricted |
97 return this.origin === CSSAgent.StyleSheetOrigin.Regular; | 98 */ |
98 } | 99 WebInspector.CSSStyleRule = class extends WebInspector.CSSRule { |
99 }; | 100 /** |
100 | 101 * @param {!WebInspector.CSSModel} cssModel |
101 /** | 102 * @param {!CSSAgent.CSSRule} payload |
102 * @constructor | 103 */ |
103 * @extends {WebInspector.CSSRule} | 104 constructor(cssModel, payload) { |
104 * @param {!WebInspector.CSSModel} cssModel | 105 super(cssModel, payload); |
105 * @param {!CSSAgent.CSSRule} payload | |
106 */ | |
107 WebInspector.CSSStyleRule = function(cssModel, payload) | |
108 { | |
109 WebInspector.CSSRule.call(this, cssModel, payload); | |
110 | 106 |
111 this._reinitializeSelectors(payload.selectorList); | 107 this._reinitializeSelectors(payload.selectorList); |
112 this.media = payload.media ? WebInspector.CSSMedia.parseMediaArrayPayload(cs
sModel, payload.media) : []; | 108 this.media = payload.media ? WebInspector.CSSMedia.parseMediaArrayPayload(cs
sModel, payload.media) : []; |
113 }; | 109 } |
114 | 110 |
115 /** | 111 /** |
116 * @param {!WebInspector.CSSModel} cssModel | 112 * @param {!WebInspector.CSSModel} cssModel |
117 * @param {string} selectorText | 113 * @param {string} selectorText |
118 * @return {!WebInspector.CSSStyleRule} | 114 * @return {!WebInspector.CSSStyleRule} |
119 */ | 115 */ |
120 WebInspector.CSSStyleRule.createDummyRule = function(cssModel, selectorText) | 116 static createDummyRule(cssModel, selectorText) { |
121 { | |
122 var dummyPayload = { | 117 var dummyPayload = { |
123 selectorList: { | 118 selectorList: { |
124 selectors: [{ text: selectorText}], | 119 selectors: [{text: selectorText}], |
125 }, | 120 }, |
126 style: { | 121 style: |
127 styleSheetId: "0", | 122 {styleSheetId: '0', range: new WebInspector.TextRange(0, 0, 0, 0), sho
rthandEntries: [], cssProperties: []} |
128 range: new WebInspector.TextRange(0, 0, 0, 0), | |
129 shorthandEntries: [], | |
130 cssProperties: [] | |
131 } | |
132 }; | 123 }; |
133 return new WebInspector.CSSStyleRule(cssModel, /** @type {!CSSAgent.CSSRule}
*/(dummyPayload)); | 124 return new WebInspector.CSSStyleRule(cssModel, /** @type {!CSSAgent.CSSRule}
*/ (dummyPayload)); |
134 }; | 125 } |
135 | 126 |
136 WebInspector.CSSStyleRule.prototype = { | 127 /** |
137 /** | 128 * @param {!CSSAgent.SelectorList} selectorList |
138 * @param {!CSSAgent.SelectorList} selectorList | 129 */ |
139 */ | 130 _reinitializeSelectors(selectorList) { |
140 _reinitializeSelectors: function(selectorList) | 131 /** @type {!Array.<!WebInspector.CSSValue>} */ |
141 { | 132 this.selectors = []; |
142 /** @type {!Array.<!WebInspector.CSSValue>} */ | 133 for (var i = 0; i < selectorList.selectors.length; ++i) |
143 this.selectors = []; | 134 this.selectors.push(new WebInspector.CSSValue(selectorList.selectors[i])); |
144 for (var i = 0; i < selectorList.selectors.length; ++i) | 135 } |
145 this.selectors.push(new WebInspector.CSSValue(selectorList.selectors
[i])); | 136 |
146 }, | 137 /** |
147 | 138 * @param {string} newSelector |
148 /** | 139 * @return {!Promise.<boolean>} |
149 * @param {string} newSelector | 140 */ |
150 * @return {!Promise.<boolean>} | 141 setSelectorText(newSelector) { |
151 */ | 142 var styleSheetId = this.styleSheetId; |
152 setSelectorText: function(newSelector) | 143 if (!styleSheetId) |
153 { | 144 throw 'No rule stylesheet id'; |
154 var styleSheetId = this.styleSheetId; | 145 var range = this.selectorRange(); |
155 if (!styleSheetId) | 146 if (!range) |
156 throw "No rule stylesheet id"; | 147 throw 'Rule selector is not editable'; |
157 var range = this.selectorRange(); | 148 return this._cssModel.setSelectorText(styleSheetId, range, newSelector); |
158 if (!range) | 149 } |
159 throw "Rule selector is not editable"; | 150 |
160 return this._cssModel.setSelectorText(styleSheetId, range, newSelector); | 151 /** |
161 }, | 152 * @return {string} |
162 | 153 */ |
163 /** | 154 selectorText() { |
164 * @return {string} | 155 return this.selectors.select('text').join(', '); |
165 */ | 156 } |
166 selectorText: function() | 157 |
167 { | 158 /** |
168 return this.selectors.select("text").join(", "); | 159 * @return {?WebInspector.TextRange} |
169 }, | 160 */ |
170 | 161 selectorRange() { |
171 /** | 162 var firstRange = this.selectors[0].range; |
172 * @return {?WebInspector.TextRange} | 163 if (!firstRange) |
173 */ | 164 return null; |
174 selectorRange: function() | 165 var lastRange = this.selectors.peekLast().range; |
175 { | 166 return new WebInspector.TextRange( |
176 var firstRange = this.selectors[0].range; | 167 firstRange.startLine, firstRange.startColumn, lastRange.endLine, lastRan
ge.endColumn); |
177 if (!firstRange) | 168 } |
178 return null; | 169 |
179 var lastRange = this.selectors.peekLast().range; | 170 /** |
180 return new WebInspector.TextRange(firstRange.startLine, firstRange.start
Column, lastRange.endLine, lastRange.endColumn); | 171 * @param {number} selectorIndex |
181 }, | 172 * @return {number} |
182 | 173 */ |
183 /** | 174 lineNumberInSource(selectorIndex) { |
184 * @param {number} selectorIndex | 175 var selector = this.selectors[selectorIndex]; |
185 * @return {number} | 176 if (!selector || !selector.range || !this.styleSheetId) |
186 */ | 177 return 0; |
187 lineNumberInSource: function(selectorIndex) | 178 var styleSheetHeader = this._cssModel.styleSheetHeaderForId(this.styleSheetI
d); |
188 { | 179 return styleSheetHeader.lineNumberInSource(selector.range.startLine); |
189 var selector = this.selectors[selectorIndex]; | 180 } |
190 if (!selector || !selector.range || !this.styleSheetId) | 181 |
191 return 0; | 182 /** |
192 var styleSheetHeader = this._cssModel.styleSheetHeaderForId(this.styleSh
eetId); | 183 * @param {number} selectorIndex |
193 return styleSheetHeader.lineNumberInSource(selector.range.startLine); | 184 * @return {number|undefined} |
194 }, | 185 */ |
195 | 186 columnNumberInSource(selectorIndex) { |
196 /** | 187 var selector = this.selectors[selectorIndex]; |
197 * @param {number} selectorIndex | 188 if (!selector || !selector.range || !this.styleSheetId) |
198 * @return {number|undefined} | 189 return undefined; |
199 */ | 190 var styleSheetHeader = this._cssModel.styleSheetHeaderForId(this.styleSheetI
d); |
200 columnNumberInSource: function(selectorIndex) | 191 console.assert(styleSheetHeader); |
201 { | 192 return styleSheetHeader.columnNumberInSource(selector.range.startLine, selec
tor.range.startColumn); |
202 var selector = this.selectors[selectorIndex]; | 193 } |
203 if (!selector || !selector.range || !this.styleSheetId) | 194 |
204 return undefined; | 195 /** |
205 var styleSheetHeader = this._cssModel.styleSheetHeaderForId(this.styleSh
eetId); | 196 * @override |
206 console.assert(styleSheetHeader); | 197 * @param {!WebInspector.CSSModel.Edit} edit |
207 return styleSheetHeader.columnNumberInSource(selector.range.startLine, s
elector.range.startColumn); | 198 */ |
208 }, | 199 rebase(edit) { |
209 | 200 if (this.styleSheetId !== edit.styleSheetId) |
210 /** | 201 return; |
211 * @override | 202 if (this.selectorRange().equal(edit.oldRange)) { |
212 * @param {!WebInspector.CSSModel.Edit} edit | 203 this._reinitializeSelectors(/** @type {!CSSAgent.SelectorList} */ (edit.pa
yload)); |
213 */ | 204 } else { |
214 rebase: function(edit) | 205 for (var i = 0; i < this.selectors.length; ++i) |
215 { | 206 this.selectors[i].rebase(edit); |
216 if (this.styleSheetId !== edit.styleSheetId) | 207 } |
217 return; | 208 for (var media of this.media) |
218 if (this.selectorRange().equal(edit.oldRange)) { | 209 media.rebase(edit); |
219 this._reinitializeSelectors(/** @type {!CSSAgent.SelectorList} */(ed
it.payload)); | 210 |
220 } else { | 211 super.rebase(edit); |
221 for (var i = 0; i < this.selectors.length; ++i) | 212 } |
222 this.selectors[i].rebase(edit); | 213 }; |
223 } | 214 |
224 for (var media of this.media) | 215 |
225 media.rebase(edit); | 216 /** |
226 | 217 * @unrestricted |
227 WebInspector.CSSRule.prototype.rebase.call(this, edit); | 218 */ |
228 }, | 219 WebInspector.CSSKeyframesRule = class { |
229 | 220 /** |
230 __proto__: WebInspector.CSSRule.prototype | 221 * @param {!WebInspector.CSSModel} cssModel |
231 }; | 222 * @param {!CSSAgent.CSSKeyframesRule} payload |
232 | 223 */ |
233 /** | 224 constructor(cssModel, payload) { |
234 * @constructor | |
235 * @param {!WebInspector.CSSModel} cssModel | |
236 * @param {!CSSAgent.CSSKeyframesRule} payload | |
237 */ | |
238 WebInspector.CSSKeyframesRule = function(cssModel, payload) | |
239 { | |
240 this._cssModel = cssModel; | 225 this._cssModel = cssModel; |
241 this._animationName = new WebInspector.CSSValue(payload.animationName); | 226 this._animationName = new WebInspector.CSSValue(payload.animationName); |
242 this._keyframes = payload.keyframes.map(keyframeRule => new WebInspector.CSS
KeyframeRule(cssModel, keyframeRule)); | 227 this._keyframes = payload.keyframes.map(keyframeRule => new WebInspector.CSS
KeyframeRule(cssModel, keyframeRule)); |
243 }; | 228 } |
244 | 229 |
245 WebInspector.CSSKeyframesRule.prototype = { | 230 /** |
246 /** | 231 * @return {!WebInspector.CSSValue} |
247 * @return {!WebInspector.CSSValue} | 232 */ |
248 */ | 233 name() { |
249 name: function() | 234 return this._animationName; |
250 { | 235 } |
251 return this._animationName; | 236 |
252 }, | 237 /** |
253 | 238 * @return {!Array.<!WebInspector.CSSKeyframeRule>} |
254 /** | 239 */ |
255 * @return {!Array.<!WebInspector.CSSKeyframeRule>} | 240 keyframes() { |
256 */ | 241 return this._keyframes; |
257 keyframes: function() | 242 } |
258 { | 243 }; |
259 return this._keyframes; | 244 |
260 } | 245 /** |
261 }; | 246 * @unrestricted |
262 | 247 */ |
263 /** | 248 WebInspector.CSSKeyframeRule = class extends WebInspector.CSSRule { |
264 * @constructor | 249 /** |
265 * @extends {WebInspector.CSSRule} | 250 * @param {!WebInspector.CSSModel} cssModel |
266 * @param {!WebInspector.CSSModel} cssModel | 251 * @param {!CSSAgent.CSSKeyframeRule} payload |
267 * @param {!CSSAgent.CSSKeyframeRule} payload | 252 */ |
268 */ | 253 constructor(cssModel, payload) { |
269 WebInspector.CSSKeyframeRule = function(cssModel, payload) | 254 super(cssModel, payload); |
270 { | |
271 WebInspector.CSSRule.call(this, cssModel, payload); | |
272 this._reinitializeKey(payload.keyText); | 255 this._reinitializeKey(payload.keyText); |
273 }; | 256 } |
274 | 257 |
275 WebInspector.CSSKeyframeRule.prototype = { | 258 /** |
276 /** | 259 * @return {!WebInspector.CSSValue} |
277 * @return {!WebInspector.CSSValue} | 260 */ |
278 */ | 261 key() { |
279 key: function() | 262 return this._keyText; |
280 { | 263 } |
281 return this._keyText; | 264 |
282 }, | 265 /** |
283 | 266 * @param {!CSSAgent.Value} payload |
284 /** | 267 */ |
285 * @param {!CSSAgent.Value} payload | 268 _reinitializeKey(payload) { |
286 */ | 269 this._keyText = new WebInspector.CSSValue(payload); |
287 _reinitializeKey: function(payload) | 270 } |
288 { | 271 |
289 this._keyText = new WebInspector.CSSValue(payload); | 272 /** |
290 }, | 273 * @override |
291 | 274 * @param {!WebInspector.CSSModel.Edit} edit |
292 /** | 275 */ |
293 * @override | 276 rebase(edit) { |
294 * @param {!WebInspector.CSSModel.Edit} edit | 277 if (this.styleSheetId !== edit.styleSheetId || !this._keyText.range) |
295 */ | 278 return; |
296 rebase: function(edit) | 279 if (edit.oldRange.equal(this._keyText.range)) |
297 { | 280 this._reinitializeKey(/** @type {!CSSAgent.Value} */ (edit.payload)); |
298 if (this.styleSheetId !== edit.styleSheetId || !this._keyText.range) | 281 else |
299 return; | 282 this._keyText.rebase(edit); |
300 if (edit.oldRange.equal(this._keyText.range)) | 283 |
301 this._reinitializeKey(/** @type {!CSSAgent.Value} */(edit.payload)); | 284 super.rebase(edit); |
302 else | 285 } |
303 this._keyText.rebase(edit); | 286 |
304 | 287 /** |
305 WebInspector.CSSRule.prototype.rebase.call(this, edit); | 288 * @param {string} newKeyText |
306 }, | 289 * @return {!Promise.<boolean>} |
307 | 290 */ |
308 /** | 291 setKeyText(newKeyText) { |
309 * @param {string} newKeyText | 292 var styleSheetId = this.styleSheetId; |
310 * @return {!Promise.<boolean>} | 293 if (!styleSheetId) |
311 */ | 294 throw 'No rule stylesheet id'; |
312 setKeyText: function(newKeyText) | 295 var range = this._keyText.range; |
313 { | 296 if (!range) |
314 var styleSheetId = this.styleSheetId; | 297 throw 'Keyframe key is not editable'; |
315 if (!styleSheetId) | 298 return this._cssModel.setKeyframeKey(styleSheetId, range, newKeyText); |
316 throw "No rule stylesheet id"; | 299 } |
317 var range = this._keyText.range; | 300 }; |
318 if (!range) | |
319 throw "Keyframe key is not editable"; | |
320 return this._cssModel.setKeyframeKey(styleSheetId, range, newKeyText); | |
321 }, | |
322 | |
323 __proto__: WebInspector.CSSRule.prototype | |
324 }; | |
OLD | NEW |