chrome-devtools-frontend
Version:
Chrome DevTools UI
70 lines (61 loc) • 2.81 kB
text/typescript
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import type * as Platform from '../../../../core/platform/platform.js';
import * as SDK from '../../../../core/sdk/sdk.js';
import type * as ProtocolProxyApi from '../../../../generated/protocol-proxy-api.js';
import type * as Protocol from '../../../../generated/protocol.js';
import * as UI from '../../legacy.js';
export class TargetDetachedDialog extends SDK.SDKModel.SDKModel<void> implements ProtocolProxyApi.InspectorDispatcher {
private static hideCrashedDialog: (() => void)|null;
constructor(target: SDK.Target.Target) {
super(target);
target.registerInspectorDispatcher(this);
void target.inspectorAgent().invoke_enable();
// Hide all dialogs if a new top-level target is created.
if (target.parentTarget()?.type() === SDK.Target.Type.BROWSER && TargetDetachedDialog.hideCrashedDialog) {
TargetDetachedDialog.hideCrashedDialog.call(null);
TargetDetachedDialog.hideCrashedDialog = null;
}
}
detached({reason}: Protocol.Inspector.DetachedEvent): void {
UI.RemoteDebuggingTerminatedScreen.RemoteDebuggingTerminatedScreen.show(reason);
}
static connectionLost(message: Platform.UIString.LocalizedString): void {
UI.RemoteDebuggingTerminatedScreen.RemoteDebuggingTerminatedScreen.show(message);
}
targetCrashed(): void {
// In case of service workers targetCrashed usually signals that the worker is stopped
// and in any case it is restarted automatically (in which case front-end will receive
// targetReloadedAfterCrash event).
if (TargetDetachedDialog.hideCrashedDialog) {
return;
}
// Ignore child targets altogether.
const parentTarget = this.target().parentTarget();
if (parentTarget && parentTarget.type() !== SDK.Target.Type.BROWSER) {
return;
}
const dialog = new UI.Dialog.Dialog('target-crashed');
dialog.setSizeBehavior(UI.GlassPane.SizeBehavior.MEASURE_CONTENT);
dialog.addCloseButton();
dialog.setDimmed(true);
TargetDetachedDialog.hideCrashedDialog = dialog.hide.bind(dialog);
new UI.TargetCrashedScreen
.TargetCrashedScreen(() => {
TargetDetachedDialog.hideCrashedDialog = null;
})
.show(dialog.contentElement);
dialog.show();
}
/** ;
*/
targetReloadedAfterCrash(): void {
void this.target().runtimeAgent().invoke_runIfWaitingForDebugger();
if (TargetDetachedDialog.hideCrashedDialog) {
TargetDetachedDialog.hideCrashedDialog.call(null);
TargetDetachedDialog.hideCrashedDialog = null;
}
}
}
SDK.SDKModel.SDKModel.register(TargetDetachedDialog, {capabilities: SDK.Target.Capability.INSPECTOR, autostart: true});