Chromium Code Reviews| Index: third_party/WebKit/Source/devtools/front_end/sdk/SubTargetsManager.js |
| diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/SubTargetsManager.js b/third_party/WebKit/Source/devtools/front_end/sdk/SubTargetsManager.js |
| index deef7e99823ca78cbe47cc4b19f03b35bdf19538..657b93a320ff0d251b4e22ecb9507a4a928d85f7 100644 |
| --- a/third_party/WebKit/Source/devtools/front_end/sdk/SubTargetsManager.js |
| +++ b/third_party/WebKit/Source/devtools/front_end/sdk/SubTargetsManager.js |
| @@ -18,7 +18,8 @@ WebInspector.SubTargetsManager = class extends WebInspector.SDKModel { |
| this._attachedTargets = new Map(); |
| /** @type {!Map<string, !WebInspector.SubTargetConnection>} */ |
| this._connections = new Map(); |
| - |
| + /** @type {!Map<string, !WebInspector.PendingTarget>} */ |
| + this._pendingTargets = new Map(); |
| this._agent.setAutoAttach(true /* autoAttach */, true /* waitForDebuggerOnStart */); |
| if (Runtime.experiments.isEnabled('autoAttachToCrossProcessSubframes')) |
| this._agent.setAttachToFrames(true); |
| @@ -33,6 +34,15 @@ WebInspector.SubTargetsManager = class extends WebInspector.SDKModel { |
| } |
| /** |
| + * @param {!WebInspector.Target} target |
| + * @return {?WebInspector.SubTargetsManager} |
| + */ |
| + static fromTarget(target) |
| + { |
| + return /** @type {?WebInspector.SubTargetsManager} */ (target.model(WebInspector.SubTargetsManager)); |
| + } |
| + |
| + /** |
| * @override |
| * @return {!Promise} |
| */ |
| @@ -58,12 +68,10 @@ WebInspector.SubTargetsManager = class extends WebInspector.SDKModel { |
| * @override |
| */ |
| dispose() { |
| - for (var connection of this._connections.values()) { |
| - this._agent.detachFromTarget(connection._targetId); |
| - connection._onDisconnect.call(null, 'disposed'); |
| - } |
| - this._connections.clear(); |
| - this._attachedTargets.clear(); |
| + for (var attachedTargetId of this._attachedTargets.keys()) |
| + this._detachedFromTarget(attachedTargetId); |
| + for (var pendingConnectionId of this._pendingTargets.keys()) |
| + this._targetDestroyed(pendingConnectionId); |
| } |
| /** |
| @@ -156,7 +164,13 @@ WebInspector.SubTargetsManager = class extends WebInspector.SDKModel { |
| target.debuggerAgent().pause(); |
| target.runtimeAgent().runIfWaitingForDebugger(); |
| - this.dispatchEventToListeners(WebInspector.SubTargetsManager.Events.SubTargetAdded, target); |
| + var pendingTarget = this._pendingTargets.get(targetInfo.id); |
| + if (!pendingTarget) { |
| + this._targetCreated(targetInfo); |
| + pendingTarget = this._pendingTargets.get(targetInfo.id); |
| + } |
| + pendingTarget.notifyAttached(target); |
| + this.dispatchEventToListeners(WebInspector.SubTargetsManager.Events.SubTargetAttached, pendingTarget); |
| } |
| /** |
| @@ -176,11 +190,10 @@ WebInspector.SubTargetsManager = class extends WebInspector.SDKModel { |
| _detachedFromTarget(targetId) { |
| var target = this._attachedTargets.get(targetId); |
| this._attachedTargets.delete(targetId); |
| - this.dispatchEventToListeners(WebInspector.SubTargetsManager.Events.SubTargetRemoved, target); |
| var connection = this._connections.get(targetId); |
| - if (connection) |
| - connection._onDisconnect.call(null, 'target terminated'); |
| + connection._onDisconnect.call(null, 'target terminated'); |
| this._connections.delete(targetId); |
| + this.dispatchEventToListeners(WebInspector.SubTargetsManager.Events.SubTargetDetached, this._pendingTargets.get(targetId)); |
| } |
| /** |
| @@ -197,16 +210,30 @@ WebInspector.SubTargetsManager = class extends WebInspector.SDKModel { |
| * @param {!WebInspector.TargetInfo} targetInfo |
| */ |
| _targetCreated(targetInfo) { |
| - if (targetInfo.type !== 'node') |
| + var pendingTarget = this._pendingTargets.get(targetInfo.id); |
| + if (pendingTarget) |
| return; |
| - this._agent.attachToTarget(targetInfo.id); |
| + pendingTarget = new WebInspector.PendingTarget(targetInfo.id, targetInfo.title, targetInfo.type === 'node', this); |
| + this._pendingTargets.set(targetInfo.id, pendingTarget); |
| + this.dispatchEventToListeners(WebInspector.SubTargetsManager.Events.SubTargetAdded, pendingTarget); |
| } |
| /** |
| * @param {string} targetId |
| */ |
| _targetDestroyed(targetId) { |
| - // All the work is done in _detachedFromTarget. |
| + var pendingTarget = this._pendingTargets.get(targetId); |
| + if (!pendingTarget) |
| + return; |
| + this._pendingTargets.delete(targetId); |
| + this.dispatchEventToListeners(WebInspector.SubTargetsManager.Events.SubTargetRemoved, pendingTarget); |
| + } |
| + |
| + /** |
| + * @return {!Array<!WebInspector.PendingTarget>} |
| + */ |
| + pendingTargets() { |
| + return this._pendingTargets.valuesArray(); |
| } |
| /** |
| @@ -231,6 +258,8 @@ WebInspector.SubTargetsManager = class extends WebInspector.SDKModel { |
| WebInspector.SubTargetsManager.Events = { |
| SubTargetAdded: Symbol('SubTargetAdded'), |
|
dgozman
2016/11/03 21:21:30
PendingTarget{Added,Removed,Attached,Detached}
eostroukhov
2016/11/03 22:44:50
Done.
|
| SubTargetRemoved: Symbol('SubTargetRemoved'), |
| + SubTargetAttached: Symbol('SubTargetAttached'), |
| + SubTargetDetached: Symbol('SubTargetDetached'), |
| }; |
| WebInspector.SubTargetsManager._InfoSymbol = Symbol('SubTargetInfo'); |
| @@ -344,3 +373,93 @@ WebInspector.TargetInfo = class { |
| this.title = WebInspector.UIString('Worker: %s', this.url); |
| } |
| }; |
| + |
| +/** |
| + * @unrestricted |
| + */ |
| +WebInspector.PendingTarget = class { |
| + /** |
| + * @param {string} id |
| + * @param {string} title |
| + * @param {boolean} canConnect |
| + * @param {?WebInspector.SubTargetsManager} manager |
| + */ |
| + constructor(id, title, canConnect, manager) { |
| + this._id = id; |
| + this._title = title; |
| + this._isRemote = canConnect; |
| + this._manager = manager; |
| + /** @type {?Promise} */ |
| + this._connectPromise = null; |
| + /** @type {?Function} */ |
| + this._attachedCallback = null; |
| + } |
| + |
| + /** |
| + * @return {string} |
| + */ |
| + id() { |
| + return this._id; |
| + } |
| + |
| + /** |
| + * @return {?WebInspector.Target} |
| + */ |
| + target() { |
| + if (!this._manager) |
| + return null; |
| + return this._manager.targetForId(this.id()); |
| + } |
| + |
| + /** |
| + * @return {string} |
| + */ |
| + name() |
| + { |
|
dgozman
2016/11/03 21:21:30
{ on the same line everywhere please.
eostroukhov
2016/11/03 22:44:50
Done.
|
| + return this._title; |
| + } |
| + |
| + /** |
| + * @return {!Promise} |
| + */ |
| + connect() |
|
dgozman
2016/11/03 21:21:30
Let's call these attach/detach to be consistent.
eostroukhov
2016/11/03 22:44:50
Done.
|
| + { |
| + if (!this._manager) |
| + return Promise.reject(); |
| + if (this._connectPromise) |
| + return this._connectPromise; |
| + if (this.target()) |
| + return Promise.resolve(this.target()); |
| + this._connectPromise = new Promise(resolve => { |
| + this._attachedCallback = resolve; |
| + this._manager._agent.attachToTarget(this.id()); |
| + }); |
| + return this._connectPromise; |
| + } |
| + |
| + disconnect() |
| + { |
| + if (!this._manager) |
| + return; |
| + this._manager._agent.detachFromTarget(this.id()); |
| + } |
| + |
| + /** |
| + * @param {!WebInspector.Target} target |
| + */ |
| + notifyAttached(target) |
| + { |
| + if (this._attachedCallback) |
| + this._attachedCallback(target); |
| + this._connectPromise = null; |
| + this._attachedCallback = null; |
| + } |
| + |
| + /** |
| + * @return {boolean} |
| + */ |
| + canConnect() |
| + { |
| + return this._isRemote; |
| + } |
| +}; |