Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2014 The Chromium Authors. All rights reserved. | 2 * Copyright 2014 The Chromium Authors. All rights reserved. |
| 3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
| 4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
| 5 */ | 5 */ |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * @constructor | 8 * @constructor |
| 9 * @extends {WebInspector.Object} | 9 * @extends {WebInspector.Object} |
| 10 */ | 10 */ |
| 11 WebInspector.TargetManager = function() | 11 WebInspector.TargetManager = function() |
| 12 { | 12 { |
| 13 WebInspector.Object.call(this); | 13 WebInspector.Object.call(this); |
| 14 /** @type {!Array.<!WebInspector.Target>} */ | 14 /** @type {!Array.<!WebInspector.Target>} */ |
| 15 this._targets = []; | 15 this._targets = []; |
| 16 /** @type {!Array.<!WebInspector.TargetManager.Observer>} */ | 16 /** @type {!Array.<!WebInspector.TargetManager.Observer>} */ |
| 17 this._observers = []; | 17 this._observers = []; |
| 18 this._observerTypeSymbol = Symbol("observerType"); | 18 this._observerCapabiliesMaskSymbol = Symbol("observerCapabilitiesMask"); |
| 19 /** @type {!Object.<string, !Array.<{modelClass: !Function, thisObject: (!Ob ject|undefined), listener: function(!WebInspector.Event)}>>} */ | 19 /** @type {!Object.<string, !Array.<{modelClass: !Function, thisObject: (!Ob ject|undefined), listener: function(!WebInspector.Event)}>>} */ |
| 20 this._modelListeners = {}; | 20 this._modelListeners = {}; |
| 21 this._isSuspended = false; | 21 this._isSuspended = false; |
| 22 } | 22 } |
| 23 | 23 |
| 24 WebInspector.TargetManager.Events = { | 24 WebInspector.TargetManager.Events = { |
| 25 InspectedURLChanged: "InspectedURLChanged", | 25 InspectedURLChanged: "InspectedURLChanged", |
| 26 MainFrameNavigated: "MainFrameNavigated", | 26 MainFrameNavigated: "MainFrameNavigated", |
| 27 Load: "Load", | 27 Load: "Load", |
| 28 PageReloadRequested: "PageReloadRequested", | 28 PageReloadRequested: "PageReloadRequested", |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 156 for (var i = 0; i < listeners.length; ++i) { | 156 for (var i = 0; i < listeners.length; ++i) { |
| 157 if (listeners[i].modelClass === modelClass && listeners[i].listener === listener && listeners[i].thisObject === thisObject) | 157 if (listeners[i].modelClass === modelClass && listeners[i].listener === listener && listeners[i].thisObject === thisObject) |
| 158 listeners.splice(i--, 1); | 158 listeners.splice(i--, 1); |
| 159 } | 159 } |
| 160 if (!listeners.length) | 160 if (!listeners.length) |
| 161 delete this._modelListeners[eventType]; | 161 delete this._modelListeners[eventType]; |
| 162 }, | 162 }, |
| 163 | 163 |
| 164 /** | 164 /** |
| 165 * @param {!WebInspector.TargetManager.Observer} targetObserver | 165 * @param {!WebInspector.TargetManager.Observer} targetObserver |
| 166 * @param {number=} type | 166 * @param {number=} capabilitiesMask |
| 167 */ | 167 */ |
| 168 observeTargets: function(targetObserver, type) | 168 observeTargets: function(targetObserver, capabilitiesMask) |
| 169 { | 169 { |
| 170 if (this._observerTypeSymbol in targetObserver) | 170 if (this._observerCapabiliesMaskSymbol in targetObserver) |
| 171 throw new Error("Observer can only be registered once"); | 171 throw new Error("Observer can only be registered once"); |
| 172 targetObserver[this._observerTypeSymbol] = type || 0x7fff; | 172 targetObserver[this._observerCapabiliesMaskSymbol] = capabilitiesMask || 0; |
| 173 this.targets(type).forEach(targetObserver.targetAdded.bind(targetObserve r)); | 173 this.targets(capabilitiesMask).forEach(targetObserver.targetAdded.bind(t argetObserver)); |
| 174 this._observers.push(targetObserver); | 174 this._observers.push(targetObserver); |
| 175 }, | 175 }, |
| 176 | 176 |
| 177 /** | 177 /** |
| 178 * @param {!WebInspector.TargetManager.Observer} targetObserver | 178 * @param {!WebInspector.TargetManager.Observer} targetObserver |
| 179 */ | 179 */ |
| 180 unobserveTargets: function(targetObserver) | 180 unobserveTargets: function(targetObserver) |
| 181 { | 181 { |
| 182 delete targetObserver[this._observerTypeSymbol]; | 182 delete targetObserver[this._observerCapabiliesMaskSymbol]; |
| 183 this._observers.remove(targetObserver); | 183 this._observers.remove(targetObserver); |
| 184 }, | 184 }, |
| 185 | 185 |
| 186 /** | 186 /** |
| 187 * @param {string} name | 187 * @param {string} name |
| 188 * @param {number} type | 188 * @param {number} capabilitiesMask |
| 189 * @param {!InspectorBackendClass.Connection} connection | 189 * @param {!InspectorBackendClass.Connection} connection |
| 190 * @param {?WebInspector.Target} parentTarget | 190 * @param {?WebInspector.Target} parentTarget |
| 191 * @return {!WebInspector.Target} | 191 * @return {!WebInspector.Target} |
| 192 */ | 192 */ |
| 193 createTarget: function(name, type, connection, parentTarget) | 193 createTarget: function(name, capabilitiesMask, connection, parentTarget) |
| 194 { | 194 { |
| 195 var target = new WebInspector.Target(this, name, type, connection, paren tTarget); | 195 var target = new WebInspector.Target(this, name, capabilitiesMask, conne ction, parentTarget); |
| 196 | 196 |
| 197 /** @type {!WebInspector.ConsoleModel} */ | 197 /** @type {!WebInspector.ConsoleModel} */ |
| 198 target.consoleModel = new WebInspector.ConsoleModel(target); | 198 target.consoleModel = new WebInspector.ConsoleModel(target); |
| 199 | 199 |
| 200 var networkManager = null; | 200 var networkManager = null; |
| 201 if (!target.isJSInspector()) | 201 if (target.hasNetworkDomains()) |
| 202 networkManager = new WebInspector.NetworkManager(target); | 202 networkManager = new WebInspector.NetworkManager(target); |
| 203 | 203 |
| 204 /** @type {!WebInspector.ResourceTreeModel} */ | 204 /** @type {!WebInspector.ResourceTreeModel} */ |
| 205 target.resourceTreeModel = new WebInspector.ResourceTreeModel(target, ne tworkManager); | 205 target.resourceTreeModel = new WebInspector.ResourceTreeModel(target, ne tworkManager); |
| 206 | 206 |
| 207 if (networkManager) | 207 if (networkManager) |
| 208 new WebInspector.NetworkLog(target, networkManager); | 208 new WebInspector.NetworkLog(target, networkManager); |
| 209 | 209 |
| 210 /** @type {!WebInspector.RuntimeModel} */ | 210 /** @type {!WebInspector.RuntimeModel} */ |
| 211 target.runtimeModel = new WebInspector.RuntimeModel(target); | 211 target.runtimeModel = new WebInspector.RuntimeModel(target); |
| 212 if (target.hasJSContext()) | 212 if (target.hasJSDomains()) |
| 213 new WebInspector.DebuggerModel(target); | 213 new WebInspector.DebuggerModel(target); |
| 214 | 214 |
| 215 if (target.type() === WebInspector.Target.Type.Page) { | 215 if (target.hasBrowserDomains()) { |
| 216 new WebInspector.DOMModel(target); | 216 new WebInspector.DOMModel(target); |
| 217 new WebInspector.CSSModel(target); | 217 new WebInspector.CSSModel(target); |
| 218 } | 218 } |
| 219 | 219 |
| 220 /** @type {?WebInspector.WorkerManager} */ | 220 /** @type {?WebInspector.WorkerManager} */ |
| 221 target.workerManager = target.supportsWorkers() ? new WebInspector.Worke rManager(target) : null; | 221 target.workerManager = target.hasWorkerDomains() ? new WebInspector.Work erManager(target) : null; |
| 222 /** @type {!WebInspector.CPUProfilerModel} */ | 222 /** @type {!WebInspector.CPUProfilerModel} */ |
| 223 target.cpuProfilerModel = new WebInspector.CPUProfilerModel(target); | 223 target.cpuProfilerModel = new WebInspector.CPUProfilerModel(target); |
| 224 /** @type {!WebInspector.HeapProfilerModel} */ | 224 /** @type {!WebInspector.HeapProfilerModel} */ |
| 225 target.heapProfilerModel = new WebInspector.HeapProfilerModel(target); | 225 target.heapProfilerModel = new WebInspector.HeapProfilerModel(target); |
| 226 | 226 |
| 227 target.tracingManager = new WebInspector.TracingManager(target); | 227 target.tracingManager = new WebInspector.TracingManager(target); |
| 228 | 228 |
| 229 if (target.isPage()) | 229 if (target.hasBrowserDomains()) |
| 230 target.serviceWorkerManager = new WebInspector.ServiceWorkerManager( target); | 230 target.serviceWorkerManager = new WebInspector.ServiceWorkerManager( target); |
| 231 | 231 |
| 232 this.addTarget(target); | 232 this.addTarget(target); |
| 233 return target; | 233 return target; |
| 234 }, | 234 }, |
| 235 | 235 |
| 236 /** | 236 /** |
| 237 * @param {number} type | 237 * Returns observers matching the capabilities mask. |
|
dgozman
2016/07/12 00:34:11
We don't usually put comments like this and rely o
eostroukhov-old
2016/07/12 21:46:16
Done.
| |
| 238 * @param {number} capabilitiesMask | |
| 238 * @return {!Array<!WebInspector.TargetManager.Observer>} | 239 * @return {!Array<!WebInspector.TargetManager.Observer>} |
| 239 */ | 240 */ |
| 240 _observersByType: function(type) | 241 _observersForMask: function(capabilitiesMask) |
| 241 { | 242 { |
| 242 var result = []; | 243 var result = []; |
| 243 for (var observer of this._observers) { | 244 for (var observer of this._observers) { |
| 244 if (observer[this._observerTypeSymbol] & type) | 245 var observerMask = observer[this._observerCapabiliesMaskSymbol]; |
| 246 // All bits should match | |
| 247 if ((observerMask & capabilitiesMask) === observerMask) | |
| 245 result.push(observer); | 248 result.push(observer); |
| 246 } | 249 } |
| 247 return result; | 250 return result; |
| 248 }, | 251 }, |
| 249 | 252 |
| 250 /** | 253 /** |
| 251 * @param {!WebInspector.Target} target | 254 * @param {!WebInspector.Target} target |
| 252 */ | 255 */ |
| 253 addTarget: function(target) | 256 addTarget: function(target) |
| 254 { | 257 { |
| 255 this._targets.push(target); | 258 this._targets.push(target); |
| 256 if (this._targets.length === 1) { | 259 if (this._targets.length === 1) { |
| 257 target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeM odel.EventTypes.InspectedURLChanged, this._redispatchEvent, this); | 260 target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeM odel.EventTypes.InspectedURLChanged, this._redispatchEvent, this); |
| 258 target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeM odel.EventTypes.MainFrameNavigated, this._redispatchEvent, this); | 261 target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeM odel.EventTypes.MainFrameNavigated, this._redispatchEvent, this); |
| 259 target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeM odel.EventTypes.Load, this._redispatchEvent, this); | 262 target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeM odel.EventTypes.Load, this._redispatchEvent, this); |
| 260 target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeM odel.EventTypes.PageReloadRequested, this._redispatchEvent, this); | 263 target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeM odel.EventTypes.PageReloadRequested, this._redispatchEvent, this); |
| 261 target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeM odel.EventTypes.WillReloadPage, this._redispatchEvent, this); | 264 target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeM odel.EventTypes.WillReloadPage, this._redispatchEvent, this); |
| 262 } | 265 } |
| 263 var copy = this._observersByType(target.type()); | 266 var copy = this._observersForMask(target.capabilitiesMask()); |
| 264 for (var i = 0; i < copy.length; ++i) | 267 for (var i = 0; i < copy.length; ++i) |
| 265 copy[i].targetAdded(target); | 268 copy[i].targetAdded(target); |
| 266 | 269 |
| 267 for (var eventType in this._modelListeners) { | 270 for (var eventType in this._modelListeners) { |
| 268 var listeners = this._modelListeners[eventType]; | 271 var listeners = this._modelListeners[eventType]; |
| 269 for (var i = 0; i < listeners.length; ++i) { | 272 for (var i = 0; i < listeners.length; ++i) { |
| 270 var model = target.model(listeners[i].modelClass); | 273 var model = target.model(listeners[i].modelClass); |
| 271 if (model) | 274 if (model) |
| 272 model.addEventListener(eventType, listeners[i].listener, lis teners[i].thisObject); | 275 model.addEventListener(eventType, listeners[i].listener, lis teners[i].thisObject); |
| 273 } | 276 } |
| 274 } | 277 } |
| 275 }, | 278 }, |
| 276 | 279 |
| 277 /** | 280 /** |
| 278 * @param {!WebInspector.Target} target | 281 * @param {!WebInspector.Target} target |
| 279 */ | 282 */ |
| 280 removeTarget: function(target) | 283 removeTarget: function(target) |
| 281 { | 284 { |
| 282 this._targets.remove(target); | 285 this._targets.remove(target); |
| 283 if (this._targets.length === 0) { | 286 if (this._targets.length === 0) { |
| 284 target.resourceTreeModel.removeEventListener(WebInspector.ResourceTr eeModel.EventTypes.InspectedURLChanged, this._redispatchEvent, this); | 287 target.resourceTreeModel.removeEventListener(WebInspector.ResourceTr eeModel.EventTypes.InspectedURLChanged, this._redispatchEvent, this); |
| 285 target.resourceTreeModel.removeEventListener(WebInspector.ResourceTr eeModel.EventTypes.MainFrameNavigated, this._redispatchEvent, this); | 288 target.resourceTreeModel.removeEventListener(WebInspector.ResourceTr eeModel.EventTypes.MainFrameNavigated, this._redispatchEvent, this); |
| 286 target.resourceTreeModel.removeEventListener(WebInspector.ResourceTr eeModel.EventTypes.Load, this._redispatchEvent, this); | 289 target.resourceTreeModel.removeEventListener(WebInspector.ResourceTr eeModel.EventTypes.Load, this._redispatchEvent, this); |
| 287 target.resourceTreeModel.removeEventListener(WebInspector.ResourceTr eeModel.EventTypes.WillReloadPage, this._redispatchEvent, this); | 290 target.resourceTreeModel.removeEventListener(WebInspector.ResourceTr eeModel.EventTypes.WillReloadPage, this._redispatchEvent, this); |
| 288 } | 291 } |
| 289 var copy = this._observersByType(target.type()); | 292 var copy = this._observersForMask(target.capabilitiesMask()); |
| 290 for (var i = 0; i < copy.length; ++i) | 293 for (var i = 0; i < copy.length; ++i) |
| 291 copy[i].targetRemoved(target); | 294 copy[i].targetRemoved(target); |
| 292 | 295 |
| 293 for (var eventType in this._modelListeners) { | 296 for (var eventType in this._modelListeners) { |
| 294 var listeners = this._modelListeners[eventType]; | 297 var listeners = this._modelListeners[eventType]; |
| 295 for (var i = 0; i < listeners.length; ++i) { | 298 for (var i = 0; i < listeners.length; ++i) { |
| 296 var model = target.model(listeners[i].modelClass); | 299 var model = target.model(listeners[i].modelClass); |
| 297 if (model) | 300 if (model) |
| 298 model.removeEventListener(eventType, listeners[i].listener, listeners[i].thisObject); | 301 model.removeEventListener(eventType, listeners[i].listener, listeners[i].thisObject); |
| 299 } | 302 } |
| 300 } | 303 } |
| 301 }, | 304 }, |
| 302 | 305 |
| 303 /** | 306 /** |
| 304 * @param {number=} type | 307 * @param {number=} capabilitiesMask |
| 305 * @return {boolean} | 308 * @return {boolean} |
| 306 */ | 309 */ |
| 307 hasTargets: function(type) | 310 hasTargets: function(capabilitiesMask) |
| 308 { | 311 { |
| 309 return !!this.targets(type).length; | 312 return !!this.targets(capabilitiesMask).length; |
| 310 }, | 313 }, |
| 311 | 314 |
| 312 /** | 315 /** |
| 313 * @param {number=} type | 316 * @param {number=} capabilitiesMask |
| 314 * @return {!Array.<!WebInspector.Target>} | 317 * @return {!Array.<!WebInspector.Target>} |
| 315 */ | 318 */ |
| 316 targets: function(type) | 319 targets: function(capabilitiesMask) |
| 317 { | 320 { |
| 318 if (!type) | 321 if (!capabilitiesMask) |
| 319 return this._targets.slice(); | 322 return this._targets.slice(); |
| 320 | 323 |
| 321 var result = []; | 324 var result = []; |
| 322 for (var target of this._targets) { | 325 for (var target of this._targets) { |
| 323 if (target.type() & type) | 326 if (target.capabilitiesMask() & capabilitiesMask) |
| 324 result.push(target); | 327 result.push(target); |
| 325 } | 328 } |
| 326 return result; | 329 return result; |
| 327 }, | 330 }, |
| 328 | 331 |
| 329 /** | 332 /** |
| 330 * @return {!Array.<!WebInspector.Target>} | 333 * @return {!Array.<!WebInspector.Target>} |
| 331 */ | 334 */ |
| 332 targetsWithJSContext: function() | 335 targetsWithJSContext: function() |
|
dgozman
2016/07/12 00:34:11
targetsWithJSDomains
eostroukhov-old
2016/07/12 21:46:16
Deleted. Not needed any more.
| |
| 333 { | 336 { |
| 334 var result = []; | 337 var result = []; |
| 335 for (var target of this._targets) { | 338 for (var target of this._targets) { |
| 336 if (target.hasJSContext()) | 339 if (target.hasJSDomains()) |
| 337 result.push(target); | 340 result.push(target); |
| 338 } | 341 } |
| 339 return result; | 342 return result; |
| 340 }, | 343 }, |
| 341 | 344 |
| 342 /** | 345 /** |
| 343 * | 346 * |
| 344 * @param {number} id | 347 * @param {number} id |
| 345 * @return {?WebInspector.Target} | 348 * @return {?WebInspector.Target} |
| 346 */ | 349 */ |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 380 /** | 383 /** |
| 381 * @param {!WebInspector.Target} target | 384 * @param {!WebInspector.Target} target |
| 382 */ | 385 */ |
| 383 targetRemoved: function(target) { }, | 386 targetRemoved: function(target) { }, |
| 384 } | 387 } |
| 385 | 388 |
| 386 /** | 389 /** |
| 387 * @type {!WebInspector.TargetManager} | 390 * @type {!WebInspector.TargetManager} |
| 388 */ | 391 */ |
| 389 WebInspector.targetManager = new WebInspector.TargetManager(); | 392 WebInspector.targetManager = new WebInspector.TargetManager(); |
| OLD | NEW |