Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3329)

Unified Diff: third_party/WebKit/Source/devtools/front_end/sdk/SubTargetsManager.js

Issue 2431223003: [DevTools]: Require explicit connection (Closed)
Patch Set: Addressed one last comment Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..a96ba49e3e9f4d863dd402276281718a6b4fc9d8 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.PendingTargetAttached, 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.PendingTargetDetached, 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.PendingTargetAdded, 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.PendingTargetRemoved, pendingTarget);
+ }
+
+ /**
+ * @return {!Array<!WebInspector.PendingTarget>}
+ */
+ pendingTargets() {
+ return this._pendingTargets.valuesArray();
}
/**
@@ -229,8 +256,10 @@ WebInspector.SubTargetsManager = class extends WebInspector.SDKModel {
/** @enum {symbol} */
WebInspector.SubTargetsManager.Events = {
- SubTargetAdded: Symbol('SubTargetAdded'),
- SubTargetRemoved: Symbol('SubTargetRemoved'),
+ PendingTargetAdded: Symbol('PendingTargetAdded'),
+ PendingTargetRemoved: Symbol('PendingTargetRemoved'),
+ PendingTargetAttached: Symbol('PendingTargetAttached'),
+ PendingTargetDetached: Symbol('PendingTargetDetached'),
};
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() {
+ return this._title;
+ }
+
+ /**
+ * @return {!Promise}
+ */
+ attach() {
+ 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;
+ }
+
+ /**
+ * @return {!Promise}
+ */
+ detach() {
+ if (this._manager)
+ this._manager._agent.detachFromTarget(this.id());
+ return Promise.resolve();
+ }
+
+ /**
+ * @param {!WebInspector.Target} target
+ */
+ notifyAttached(target)
+ {
+ if (this._attachedCallback)
+ this._attachedCallback(target);
+ this._connectPromise = null;
+ this._attachedCallback = null;
+ }
+
+ /**
+ * @return {boolean}
+ */
+ canConnect()
+ {
+ return this._isRemote;
+ }
+};

Powered by Google App Engine
This is Rietveld 408576698