Commit dc130713 authored by Dmitry Gozman's avatar Dmitry Gozman Committed by Commit Bot

[DevTools] Fix a race when inspecting shared/service worker

When pausing on initialization, we issue Debugger.enable
immediately followed by Debugger.pause and expect the pause to happen.

Because Debugger.pause can interrupt JS, it may actually run before
Debugger.enable on the backend. That makes pause noop, and we never
pause.

The solution is to await for Debugger.enable before asking to pause.

Bug: 775132, 900432
Change-Id: Ic2f504875b98312839235c6e32a10403757444f2
Reviewed-on: https://chromium-review.googlesource.com/c/1309213
Commit-Queue: Dmitry Gozman <dgozman@chromium.org>
Reviewed-by: default avatarPavel Feldman <pfeldman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#604299}
parent 95c6ac29
......@@ -30,7 +30,7 @@ SDK.ChildTargetManager = class extends SDK.SDKModel {
}
/**
* @param {function({target: !SDK.Target, waitingForDebugger: boolean})=} attachCallback
* @param {function({target: !SDK.Target, waitingForDebugger: boolean}):!Promise=} attachCallback
*/
static install(attachCallback) {
SDK.ChildTargetManager._attachCallback = attachCallback;
......@@ -138,9 +138,13 @@ SDK.ChildTargetManager = class extends SDK.SDKModel {
targetInfo.targetId, targetName, this._capabilitiesForType(targetInfo.type),
this._createChildConnection.bind(this, this._targetAgent, sessionId), this._parentTarget, false /* isNodeJS */);
if (SDK.ChildTargetManager._attachCallback)
SDK.ChildTargetManager._attachCallback({target, waitingForDebugger});
target.runtimeAgent().runIfWaitingForDebugger();
if (SDK.ChildTargetManager._attachCallback) {
SDK.ChildTargetManager._attachCallback({target, waitingForDebugger}).then(() => {
target.runtimeAgent().runIfWaitingForDebugger();
});
} else {
target.runtimeAgent().runIfWaitingForDebugger();
}
}
/**
......
......@@ -136,6 +136,14 @@ SDK.DebuggerModel = class extends SDK.SDKModel {
return;
SDK.DebuggerModel._debuggerIdToModel.set(debuggerId, this);
this._debuggerId = debuggerId;
this.dispatchEventToListeners(SDK.DebuggerModel.Events.DebuggerIsReadyToPause, this);
}
/**
* @return {boolean}
*/
isReadyToPause() {
return !!this._debuggerId;
}
/**
......@@ -929,7 +937,8 @@ SDK.DebuggerModel.Events = {
DiscardedAnonymousScriptSource: Symbol('DiscardedAnonymousScriptSource'),
GlobalObjectCleared: Symbol('GlobalObjectCleared'),
CallFrameSelected: Symbol('CallFrameSelected'),
ConsoleCommandEvaluatedInSelectedCallFrame: Symbol('ConsoleCommandEvaluatedInSelectedCallFrame')
ConsoleCommandEvaluatedInSelectedCallFrame: Symbol('ConsoleCommandEvaluatedInSelectedCallFrame'),
DebuggerIsReadyToPause: Symbol('DebuggerIsReadyToPause'),
};
/** @enum {string} */
......
......@@ -27,12 +27,15 @@ WorkerMain.WorkerMain = class extends Common.Object {
}
};
SDK.ChildTargetManager.install(({target, waitingForDebugger}) => {
SDK.ChildTargetManager.install(async ({target, waitingForDebugger}) => {
const parentTarget = target.parentTarget();
// Only pause the new worker if debugging SW - we are going through the pause on start checkbox.
if (!parentTarget.parentTarget() && waitingForDebugger) {
const debuggerModel = target.model(SDK.DebuggerModel);
if (debuggerModel)
debuggerModel.pause();
}
if (parentTarget.parentTarget() || !waitingForDebugger)
return;
const debuggerModel = target.model(SDK.DebuggerModel);
if (!debuggerModel)
return;
if (!debuggerModel.isReadyToPause())
await debuggerModel.once(SDK.DebuggerModel.Events.DebuggerIsReadyToPause);
debuggerModel.pause();
});
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment