OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 /** |
6 * @implements {SDK.SDKModelObserver<!SDK.CSSModel>} | 6 * @implements {SDK.SDKModelObserver<!SDK.CSSModel>} |
7 */ | 7 */ |
8 Bindings.CSSWorkspaceBinding = class { | 8 Bindings.CSSWorkspaceBinding = class { |
9 /** | 9 /** |
10 * @param {!SDK.TargetManager} targetManager | 10 * @param {!SDK.TargetManager} targetManager |
(...skipping 13 matching lines...) Expand all Loading... | |
24 */ | 24 */ |
25 modelAdded(cssModel) { | 25 modelAdded(cssModel) { |
26 this._modelToInfo.set(cssModel, new Bindings.CSSWorkspaceBinding.ModelInfo(c ssModel, this._workspace)); | 26 this._modelToInfo.set(cssModel, new Bindings.CSSWorkspaceBinding.ModelInfo(c ssModel, this._workspace)); |
27 } | 27 } |
28 | 28 |
29 /** | 29 /** |
30 * @override | 30 * @override |
31 * @param {!SDK.CSSModel} cssModel | 31 * @param {!SDK.CSSModel} cssModel |
32 */ | 32 */ |
33 modelRemoved(cssModel) { | 33 modelRemoved(cssModel) { |
34 this._modelToInfo.remove(cssModel)._dispose(); | 34 this._modelToInfo.get(cssModel)._dispose(); |
35 } | 35 this._modelToInfo.delete(cssModel); |
36 | |
37 /** | |
38 * @param {!SDK.CSSStyleSheetHeader} header | |
39 * @return {?Bindings.CSSWorkspaceBinding.ModelInfo} | |
40 */ | |
41 _modelInfo(header) { | |
42 return this._modelToInfo.get(header.cssModel()) || null; | |
43 } | |
44 | |
45 /** | |
46 * @param {!SDK.CSSStyleSheetHeader} header | |
47 * @return {!Bindings.CSSWorkspaceBinding.ModelInfo} | |
48 */ | |
49 _ensureModelInfo(header) { | |
50 var modelInfo = this._modelToInfo.get(header.cssModel()); | |
51 if (!modelInfo) { | |
52 modelInfo = new Bindings.CSSWorkspaceBinding.ModelInfo(header.cssModel(), this._workspace); | |
53 this._modelToInfo.set(header.cssModel(), modelInfo); | |
54 } | |
55 return modelInfo; | |
56 } | 36 } |
57 | 37 |
58 /** | 38 /** |
59 * @param {!SDK.CSSStyleSheetHeader} header | 39 * @param {!SDK.CSSStyleSheetHeader} header |
60 */ | 40 */ |
61 updateLocations(header) { | 41 updateLocations(header) { |
62 var modelInfo = this._modelInfo(header); | 42 this._modelToInfo.get(header.cssModel())._updateLocations(header); |
63 if (modelInfo) | |
64 modelInfo._updateLocations(header); | |
65 } | 43 } |
66 | 44 |
67 /** | 45 /** |
68 * @param {!SDK.CSSLocation} rawLocation | 46 * @param {!SDK.CSSLocation} rawLocation |
69 * @param {function(!Bindings.LiveLocation)} updateDelegate | 47 * @param {function(!Bindings.LiveLocation)} updateDelegate |
70 * @param {!Bindings.LiveLocationPool} locationPool | 48 * @param {!Bindings.LiveLocationPool} locationPool |
71 * @return {!Bindings.CSSWorkspaceBinding.LiveLocation} | 49 * @return {!Bindings.CSSWorkspaceBinding.LiveLocation} |
72 */ | 50 */ |
73 createLiveLocation(rawLocation, updateDelegate, locationPool) { | 51 createLiveLocation(rawLocation, updateDelegate, locationPool) { |
74 var header = | 52 return this._modelToInfo.get(rawLocation.cssModel())._createLiveLocation(raw Location, updateDelegate, locationPool); |
75 rawLocation.styleSheetId ? rawLocation.cssModel().styleSheetHeaderForId( rawLocation.styleSheetId) : null; | |
76 return new Bindings.CSSWorkspaceBinding.LiveLocation( | |
77 rawLocation.cssModel(), header, rawLocation, this, updateDelegate, locat ionPool); | |
78 } | 53 } |
79 | 54 |
80 /** | 55 /** |
81 * @param {!Bindings.CSSWorkspaceBinding.LiveLocation} location | |
82 */ | |
83 _addLiveLocation(location) { | |
84 this._ensureModelInfo(location._header)._addLocation(location); | |
85 } | |
86 | |
87 /** | |
88 * @param {!Bindings.CSSWorkspaceBinding.LiveLocation} location | |
89 */ | |
90 _removeLiveLocation(location) { | |
91 var modelInfo = this._modelInfo(location._header); | |
92 if (modelInfo) | |
93 modelInfo._removeLocation(location); | |
94 } | |
95 | |
96 /** | |
97 * @param {!SDK.CSSProperty} cssProperty | 56 * @param {!SDK.CSSProperty} cssProperty |
98 * @param {boolean} forName | 57 * @param {boolean} forName |
99 * @return {?Workspace.UILocation} | 58 * @return {?Workspace.UILocation} |
100 */ | 59 */ |
101 propertyUILocation(cssProperty, forName) { | 60 propertyUILocation(cssProperty, forName) { |
102 var style = cssProperty.ownerStyle; | 61 var style = cssProperty.ownerStyle; |
103 if (!style || style.type !== SDK.CSSStyleDeclaration.Type.Regular || !style. styleSheetId) | 62 if (!style || style.type !== SDK.CSSStyleDeclaration.Type.Regular || !style. styleSheetId) |
104 return null; | 63 return null; |
105 var header = style.cssModel().styleSheetHeaderForId(style.styleSheetId); | 64 var header = style.cssModel().styleSheetHeaderForId(style.styleSheetId); |
106 if (!header) | 65 if (!header) |
(...skipping 10 matching lines...) Expand all Loading... | |
117 return this.rawLocationToUILocation(rawLocation); | 76 return this.rawLocationToUILocation(rawLocation); |
118 } | 77 } |
119 | 78 |
120 /** | 79 /** |
121 * @param {?SDK.CSSLocation} rawLocation | 80 * @param {?SDK.CSSLocation} rawLocation |
122 * @return {?Workspace.UILocation} | 81 * @return {?Workspace.UILocation} |
123 */ | 82 */ |
124 rawLocationToUILocation(rawLocation) { | 83 rawLocationToUILocation(rawLocation) { |
125 if (!rawLocation) | 84 if (!rawLocation) |
126 return null; | 85 return null; |
127 var header = rawLocation.cssModel().styleSheetHeaderForId(rawLocation.styleS heetId); | 86 return this._modelToInfo.get(rawLocation.cssModel())._rawLocationToUILocatio n(rawLocation); |
128 if (!header) | |
129 return null; | |
130 var modelInfo = this._modelInfo(header); | |
131 return modelInfo ? modelInfo._rawLocationToUILocation(header, rawLocation.li neNumber, rawLocation.columnNumber) : | |
132 null; | |
133 } | 87 } |
134 }; | 88 }; |
135 | 89 |
136 Bindings.CSSWorkspaceBinding.ModelInfo = class { | 90 Bindings.CSSWorkspaceBinding.ModelInfo = class { |
137 /** | 91 /** |
138 * @param {!SDK.CSSModel} cssModel | 92 * @param {!SDK.CSSModel} cssModel |
139 * @param {!Workspace.Workspace} workspace | 93 * @param {!Workspace.Workspace} workspace |
140 */ | 94 */ |
141 constructor(cssModel, workspace) { | 95 constructor(cssModel, workspace) { |
142 this._cssModel = cssModel; | 96 this._eventListeners = [ |
97 cssModel.addEventListener(SDK.CSSModel.Events.StyleSheetAdded, this._style SheetAdded, this), | |
98 cssModel.addEventListener(SDK.CSSModel.Events.StyleSheetRemoved, this._sty leSheetRemoved, this) | |
99 ]; | |
100 | |
143 this._stylesSourceMapping = new Bindings.StylesSourceMapping(cssModel, works pace); | 101 this._stylesSourceMapping = new Bindings.StylesSourceMapping(cssModel, works pace); |
144 this._sassSourceMapping = | 102 this._sassSourceMapping = |
145 new Bindings.SASSSourceMapping(cssModel, workspace, Bindings.NetworkProj ect.forTarget(cssModel.target())); | 103 new Bindings.SASSSourceMapping(cssModel, workspace, Bindings.NetworkProj ect.forTarget(cssModel.target())); |
146 | 104 |
147 /** @type {!Multimap<!SDK.CSSStyleSheetHeader, !Bindings.LiveLocation>} */ | 105 /** @type {!Multimap<!SDK.CSSStyleSheetHeader, !Bindings.CSSWorkspaceBinding .LiveLocation>} */ |
148 this._locations = new Multimap(); | 106 this._locations = new Multimap(); |
107 /** @type {!Multimap<string, !Bindings.CSSWorkspaceBinding.LiveLocation>} */ | |
108 this._unboundLocations = new Multimap(); | |
109 } | |
110 | |
111 /** | |
112 * @param {!SDK.CSSLocation} rawLocation | |
113 * @param {function(!Bindings.LiveLocation)} updateDelegate | |
114 * @param {!Bindings.LiveLocationPool} locationPool | |
115 * @return {!Bindings.CSSWorkspaceBinding.LiveLocation} | |
116 */ | |
117 _createLiveLocation(rawLocation, updateDelegate, locationPool) { | |
118 var location = new Bindings.CSSWorkspaceBinding.LiveLocation(rawLocation, th is, updateDelegate, locationPool); | |
119 var header = rawLocation.header(); | |
120 if (header) { | |
121 location._header = header; | |
122 this._locations.set(header, location); | |
123 location.update(); | |
124 } else { | |
125 this._unboundLocations.set(rawLocation.url, location); | |
126 } | |
127 return location; | |
149 } | 128 } |
150 | 129 |
151 /** | 130 /** |
152 * @param {!Bindings.CSSWorkspaceBinding.LiveLocation} location | 131 * @param {!Bindings.CSSWorkspaceBinding.LiveLocation} location |
153 */ | 132 */ |
154 _addLocation(location) { | 133 _disposeLocation(location) { |
155 var header = location._header; | 134 if (location._header) |
156 this._locations.set(header, location); | 135 this._locations.remove(location._header, location); |
157 location.update(); | 136 else |
137 this._unboundLocations.remove(location._rawLocation.url, location); | |
158 } | 138 } |
159 | 139 |
160 /** | 140 /** |
161 * @param {!Bindings.CSSWorkspaceBinding.LiveLocation} location | |
162 */ | |
163 _removeLocation(location) { | |
164 this._locations.remove(location._header, location); | |
165 } | |
166 | |
167 /** | |
168 * @param {!SDK.CSSStyleSheetHeader} header | 141 * @param {!SDK.CSSStyleSheetHeader} header |
169 */ | 142 */ |
170 _updateLocations(header) { | 143 _updateLocations(header) { |
171 for (var location of this._locations.get(header)) | 144 for (var location of this._locations.get(header)) |
172 location.update(); | 145 location.update(); |
173 } | 146 } |
174 | 147 |
175 /** | 148 /** |
176 * @param {!SDK.CSSStyleSheetHeader} header | 149 * @param {!Common.Event} event |
177 * @param {number} lineNumber | 150 */ |
178 * @param {number=} columnNumber | 151 _styleSheetAdded(event) { |
152 var header = /** @type {!SDK.CSSStyleSheetHeader} */ (event.data); | |
153 if (!header.sourceURL) | |
154 return; | |
155 | |
156 for (var location of this._unboundLocations.get(header.sourceURL)) { | |
157 location._header = header; | |
158 this._locations.set(header, location); | |
159 location.update(); | |
160 } | |
161 this._unboundLocations.removeAll(header.sourceURL); | |
162 } | |
163 | |
164 /** | |
165 * @param {!Common.Event} event | |
166 */ | |
167 _styleSheetRemoved(event) { | |
168 var header = /** @type {!SDK.CSSStyleSheetHeader} */ (event.data); | |
169 for (var location of this._locations.get(header)) { | |
170 location._header = null; | |
171 this._unboundLocations.set(location._rawLocation.url, location); | |
lushnikov
2017/02/16 02:40:03
location.update() should be called here
dgozman
2017/02/16 18:25:52
Done.
| |
172 } | |
173 this._locations.removeAll(header); | |
174 } | |
175 | |
176 /** | |
177 * @param {!SDK.CSSLocation} rawLocation | |
179 * @return {?Workspace.UILocation} | 178 * @return {?Workspace.UILocation} |
180 */ | 179 */ |
181 _rawLocationToUILocation(header, lineNumber, columnNumber) { | 180 _rawLocationToUILocation(rawLocation) { |
182 var rawLocation = new SDK.CSSLocation(header, lineNumber, columnNumber); | |
183 var uiLocation = null; | 181 var uiLocation = null; |
184 uiLocation = uiLocation || this._sassSourceMapping.rawLocationToUILocation(r awLocation); | 182 uiLocation = uiLocation || this._sassSourceMapping.rawLocationToUILocation(r awLocation); |
185 uiLocation = uiLocation || this._stylesSourceMapping.rawLocationToUILocation (rawLocation); | 183 uiLocation = uiLocation || this._stylesSourceMapping.rawLocationToUILocation (rawLocation); |
186 return uiLocation; | 184 return uiLocation; |
187 } | 185 } |
188 | 186 |
189 _dispose() { | 187 _dispose() { |
188 Common.EventTarget.removeEventListeners(this._eventListeners); | |
190 this._stylesSourceMapping.dispose(); | 189 this._stylesSourceMapping.dispose(); |
191 this._sassSourceMapping.dispose(); | 190 this._sassSourceMapping.dispose(); |
192 } | 191 } |
193 }; | 192 }; |
194 | 193 |
195 /** | 194 /** |
196 * @unrestricted | 195 * @unrestricted |
197 */ | 196 */ |
198 Bindings.CSSWorkspaceBinding.LiveLocation = class extends Bindings.LiveLocationW ithPool { | 197 Bindings.CSSWorkspaceBinding.LiveLocation = class extends Bindings.LiveLocationW ithPool { |
199 /** | 198 /** |
200 * @param {!SDK.CSSModel} cssModel | |
201 * @param {?SDK.CSSStyleSheetHeader} header | |
202 * @param {!SDK.CSSLocation} rawLocation | 199 * @param {!SDK.CSSLocation} rawLocation |
203 * @param {!Bindings.CSSWorkspaceBinding} binding | 200 * @param {!Bindings.CSSWorkspaceBinding.ModelInfo} info |
204 * @param {function(!Bindings.LiveLocation)} updateDelegate | 201 * @param {function(!Bindings.LiveLocation)} updateDelegate |
205 * @param {!Bindings.LiveLocationPool} locationPool | 202 * @param {!Bindings.LiveLocationPool} locationPool |
206 */ | 203 */ |
207 constructor(cssModel, header, rawLocation, binding, updateDelegate, locationPo ol) { | 204 constructor(rawLocation, info, updateDelegate, locationPool) { |
208 super(updateDelegate, locationPool); | 205 super(updateDelegate, locationPool); |
209 this._cssModel = cssModel; | |
210 this._rawLocation = rawLocation; | 206 this._rawLocation = rawLocation; |
lushnikov
2017/02/16 02:40:03
let's store lineNumber, columnNumber & url instead
dgozman
2017/02/16 18:25:52
Done.
| |
211 this._binding = binding; | 207 this._info = info; |
212 if (!header) | 208 this._header = null; |
213 this._clearStyleSheet(); | |
214 else | |
215 this._setStyleSheet(header); | |
216 } | 209 } |
217 | 210 |
218 /** | 211 /** |
219 * @param {!Common.Event} event | |
220 */ | |
221 _styleSheetAdded(event) { | |
222 console.assert(!this._header); | |
223 var header = /** @type {!SDK.CSSStyleSheetHeader} */ (event.data); | |
224 if (header.sourceURL && header.sourceURL === this._rawLocation.url) | |
225 this._setStyleSheet(header); | |
226 } | |
227 | |
228 /** | |
229 * @param {!Common.Event} event | |
230 */ | |
231 _styleSheetRemoved(event) { | |
232 console.assert(this._header); | |
233 var header = /** @type {!SDK.CSSStyleSheetHeader} */ (event.data); | |
234 if (this._header !== header) | |
235 return; | |
236 this._binding._removeLiveLocation(this); | |
237 this._clearStyleSheet(); | |
238 } | |
239 | |
240 /** | |
241 * @param {!SDK.CSSStyleSheetHeader} header | |
242 */ | |
243 _setStyleSheet(header) { | |
244 this._header = header; | |
245 this._binding._addLiveLocation(this); | |
246 this._cssModel.removeEventListener(SDK.CSSModel.Events.StyleSheetAdded, this ._styleSheetAdded, this); | |
247 this._cssModel.addEventListener(SDK.CSSModel.Events.StyleSheetRemoved, this. _styleSheetRemoved, this); | |
248 } | |
249 | |
250 _clearStyleSheet() { | |
251 delete this._header; | |
252 this._cssModel.removeEventListener(SDK.CSSModel.Events.StyleSheetRemoved, th is._styleSheetRemoved, this); | |
253 this._cssModel.addEventListener(SDK.CSSModel.Events.StyleSheetAdded, this._s tyleSheetAdded, this); | |
254 } | |
255 | |
256 /** | |
257 * @override | 212 * @override |
258 * @return {?Workspace.UILocation} | 213 * @return {?Workspace.UILocation} |
259 */ | 214 */ |
260 uiLocation() { | 215 uiLocation() { |
261 var cssLocation = this._rawLocation; | 216 if (!this._header) |
262 if (this._header) { | |
263 var modelInfo = this._binding._modelInfo(this._header); | |
264 return modelInfo._rawLocationToUILocation(this._header, cssLocation.lineNu mber, cssLocation.columnNumber); | |
265 } | |
266 var uiSourceCode = Bindings.NetworkProject.uiSourceCodeForStyleURL( | |
267 this._binding._workspace, cssLocation.url, cssLocation.header()); | |
268 if (!uiSourceCode) | |
269 return null; | 217 return null; |
270 return uiSourceCode.uiLocation(cssLocation.lineNumber, cssLocation.columnNum ber); | 218 var rawLocation = new SDK.CSSLocation(this._header, this._rawLocation.lineNu mber, this._rawLocation.columnNumber); |
219 return this._info._rawLocationToUILocation(rawLocation); | |
271 } | 220 } |
272 | 221 |
273 /** | 222 /** |
274 * @override | 223 * @override |
275 */ | 224 */ |
276 dispose() { | 225 dispose() { |
277 super.dispose(); | 226 super.dispose(); |
278 if (this._header) | 227 this._info._disposeLocation(this); |
279 this._binding._removeLiveLocation(this); | |
280 this._cssModel.removeEventListener(SDK.CSSModel.Events.StyleSheetAdded, this ._styleSheetAdded, this); | |
281 this._cssModel.removeEventListener(SDK.CSSModel.Events.StyleSheetRemoved, th is._styleSheetRemoved, this); | |
282 } | 228 } |
283 | 229 |
284 /** | 230 /** |
285 * @override | 231 * @override |
286 * @return {boolean} | 232 * @return {boolean} |
287 */ | 233 */ |
288 isBlackboxed() { | 234 isBlackboxed() { |
289 return false; | 235 return false; |
290 } | 236 } |
291 }; | 237 }; |
292 | 238 |
293 /** | 239 /** |
294 * @type {!Bindings.CSSWorkspaceBinding} | 240 * @type {!Bindings.CSSWorkspaceBinding} |
295 */ | 241 */ |
296 Bindings.cssWorkspaceBinding; | 242 Bindings.cssWorkspaceBinding; |
OLD | NEW |