Chromium Code Reviews| 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 |