Skip to content

Commit d7565fb

Browse files
committed
Use App instead of ExtensionContext for webviews
1 parent 9175449 commit d7565fb

15 files changed

Lines changed: 57 additions & 83 deletions

File tree

extensions/ql-vscode/src/common/vscode/abstract-webview.ts

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {
22
WebviewPanel,
3-
ExtensionContext,
43
window as Window,
54
ViewColumn,
65
Uri,
@@ -9,6 +8,7 @@ import {
98
} from "vscode";
109
import { join } from "path";
1110

11+
import { App } from "../app";
1212
import { DisposableObject, DisposeHandler } from "../disposable-object";
1313
import { tmpDir } from "../../tmp-dir";
1414
import { getHtmlForWebview, WebviewMessage, WebviewKind } from "./webview-html";
@@ -34,7 +34,7 @@ export abstract class AbstractWebview<
3434

3535
private panelResolves?: Array<(panel: WebviewPanel) => void>;
3636

37-
constructor(protected readonly ctx: ExtensionContext) {
37+
constructor(protected readonly app: App) {
3838
super();
3939
}
4040

@@ -50,8 +50,6 @@ export abstract class AbstractWebview<
5050

5151
protected async getPanel(): Promise<WebviewPanel> {
5252
if (this.panel === undefined) {
53-
const { ctx } = this;
54-
5553
// This is an async method, so in theory this method can be called concurrently. To ensure that we don't
5654
// create two panels, we use a promise that resolves when the panel is created. This way, if the panel is
5755
// being created, the promise will resolve when it is done.
@@ -81,7 +79,7 @@ export abstract class AbstractWebview<
8179
localResourceRoots: [
8280
...(config.additionalOptions?.localResourceRoots ?? []),
8381
Uri.file(tmpDir.name),
84-
Uri.file(join(ctx.extensionPath, "out")),
82+
Uri.file(join(this.app.extensionPath, "out")),
8583
],
8684
},
8785
);
@@ -99,19 +97,15 @@ export abstract class AbstractWebview<
9997

10098
protected setupPanel(panel: WebviewPanel, config: WebviewPanelConfig): void {
10199
this.push(
102-
panel.onDidDispose(
103-
() => {
104-
this.panel = undefined;
105-
this.panelLoaded = false;
106-
this.onPanelDispose();
107-
},
108-
null,
109-
this.ctx.subscriptions,
110-
),
100+
panel.onDidDispose(() => {
101+
this.panel = undefined;
102+
this.panelLoaded = false;
103+
this.onPanelDispose();
104+
}, null),
111105
);
112106

113107
panel.webview.html = getHtmlForWebview(
114-
this.ctx,
108+
this.app,
115109
panel.webview,
116110
config.view,
117111
{
@@ -123,7 +117,6 @@ export abstract class AbstractWebview<
123117
panel.webview.onDidReceiveMessage(
124118
async (e) => this.onMessage(e),
125119
undefined,
126-
this.ctx.subscriptions,
127120
),
128121
);
129122
}

extensions/ql-vscode/src/common/vscode/webview-html.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { ExtensionContext, Uri, Webview } from "vscode";
1+
import { Uri, Webview } from "vscode";
22
import { randomBytes } from "crypto";
33
import { EOL } from "os";
4+
import { App } from "../app";
45

56
export type WebviewKind =
67
| "results"
@@ -19,7 +20,7 @@ export interface WebviewMessage {
1920
* Uses a content security policy that only loads the given script.
2021
*/
2122
export function getHtmlForWebview(
22-
ctx: ExtensionContext,
23+
app: App,
2324
webview: Webview,
2425
view: WebviewKind,
2526
{
@@ -33,10 +34,13 @@ export function getHtmlForWebview(
3334
allowWasmEval: false,
3435
},
3536
): string {
36-
const scriptUriOnDisk = Uri.file(ctx.asAbsolutePath("out/webview.js"));
37+
const scriptUriOnDisk = Uri.joinPath(
38+
Uri.file(app.extensionPath),
39+
"out/webview.js",
40+
);
3741

3842
const stylesheetUrisOnDisk = [
39-
Uri.file(ctx.asAbsolutePath("out/webview.css")),
43+
Uri.joinPath(Uri.file(app.extensionPath), "out/webview.css"),
4044
];
4145

4246
// Convert the on-disk URIs into webview URIs.

extensions/ql-vscode/src/compare/compare-view.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ExtensionContext, ViewColumn } from "vscode";
1+
import { ViewColumn } from "vscode";
22

33
import {
44
FromCompareViewMessage,
@@ -25,6 +25,7 @@ import {
2525
} from "../common/vscode/abstract-webview";
2626
import { telemetryListener } from "../common/vscode/telemetry";
2727
import { redactableError } from "../common/errors";
28+
import { App } from "../common/app";
2829

2930
interface ComparePair {
3031
from: CompletedLocalQueryInfo;
@@ -38,7 +39,7 @@ export class CompareView extends AbstractWebview<
3839
private comparePair: ComparePair | undefined;
3940

4041
constructor(
41-
ctx: ExtensionContext,
42+
app: App,
4243
private databaseManager: DatabaseManager,
4344
private cliServer: CodeQLCliServer,
4445
private logger: Logger,
@@ -47,7 +48,7 @@ export class CompareView extends AbstractWebview<
4748
item: CompletedLocalQueryInfo,
4849
) => Promise<void>,
4950
) {
50-
super(ctx);
51+
super(app);
5152
}
5253

5354
async showResults(

extensions/ql-vscode/src/extension.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -396,10 +396,7 @@ export async function activate(
396396
),
397397
);
398398

399-
const variantAnalysisViewSerializer = new VariantAnalysisViewSerializer(
400-
ctx,
401-
app,
402-
);
399+
const variantAnalysisViewSerializer = new VariantAnalysisViewSerializer(app);
403400
Window.registerWebviewPanelSerializer(
404401
VariantAnalysisView.viewType,
405402
variantAnalysisViewSerializer,
@@ -813,7 +810,7 @@ async function activateWithInstalledDistribution(
813810

814811
void extLogger.log("Initializing results panel interface.");
815812
const localQueryResultsView = new ResultsView(
816-
ctx,
813+
app,
817814
dbm,
818815
cliServer,
819816
queryServerLogger,
@@ -836,7 +833,6 @@ async function activateWithInstalledDistribution(
836833
);
837834

838835
const variantAnalysisManager = new VariantAnalysisManager(
839-
ctx,
840836
app,
841837
cliServer,
842838
variantAnalysisStorageDir,
@@ -888,7 +884,7 @@ async function activateWithInstalledDistribution(
888884

889885
void extLogger.log("Initializing compare view.");
890886
const compareView = new CompareView(
891-
ctx,
887+
app,
892888
dbm,
893889
cliServer,
894890
queryServerLogger,
@@ -935,7 +931,6 @@ async function activateWithInstalledDistribution(
935931
ctx.subscriptions.push(debuggerUI);
936932

937933
const modelEditorModule = await ModelEditorModule.initialize(
938-
ctx,
939934
app,
940935
dbm,
941936
cliServer,

extensions/ql-vscode/src/local-queries/results-view.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ import { HistoryItemLabelProvider } from "../query-history/history-item-label-pr
7474
import { telemetryListener } from "../common/vscode/telemetry";
7575
import { redactableError } from "../common/errors";
7676
import { ResultsViewCommands } from "../common/commands";
77+
import { App } from "../common/app";
7778

7879
/**
7980
* results-view.ts
@@ -168,13 +169,13 @@ export class ResultsView extends AbstractWebview<
168169
);
169170

170171
constructor(
171-
public ctx: vscode.ExtensionContext,
172+
app: App,
172173
private databaseManager: DatabaseManager,
173174
public cliServer: CodeQLCliServer,
174175
public logger: Logger,
175176
private labelProvider: HistoryItemLabelProvider,
176177
) {
177-
super(ctx);
178+
super(app);
178179
this.push(this._diagnosticCollection);
179180
this.push(
180181
vscode.window.onDidChangeTextEditorSelection(

extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-panel.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
import { ExtensionContext, window } from "vscode";
1+
import { window } from "vscode";
2+
import { App } from "../../common/app";
23
import { DisposableObject } from "../../common/disposable-object";
34
import { MethodModelingViewProvider } from "./method-modeling-view-provider";
45
import { Method } from "../method";
56

67
export class MethodModelingPanel extends DisposableObject {
78
private readonly provider: MethodModelingViewProvider;
89

9-
constructor(context: ExtensionContext) {
10+
constructor(app: App) {
1011
super();
1112

12-
this.provider = new MethodModelingViewProvider(context);
13+
this.provider = new MethodModelingViewProvider(app);
1314
this.push(
1415
window.registerWebviewViewProvider(
1516
MethodModelingViewProvider.viewType,

extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import * as vscode from "vscode";
2-
import { WebviewViewProvider } from "vscode";
2+
import { Uri, WebviewViewProvider } from "vscode";
33
import { getHtmlForWebview } from "../../common/vscode/webview-html";
44
import { FromMethodModelingMessage } from "../../common/interface-types";
55
import { telemetryListener } from "../../common/vscode/telemetry";
66
import { showAndLogExceptionWithTelemetry } from "../../common/logging/notifications";
77
import { extLogger } from "../../common/logging/vscode/loggers";
8+
import { App } from "../../common/app";
89
import { redactableError } from "../../common/errors";
910
import { Method } from "../method";
1011

@@ -13,7 +14,7 @@ export class MethodModelingViewProvider implements WebviewViewProvider {
1314

1415
private webviewView: vscode.WebviewView | undefined = undefined;
1516

16-
constructor(private readonly context: vscode.ExtensionContext) {}
17+
constructor(private readonly app: App) {}
1718

1819
/**
1920
* This is called when a view first becomes visible. This may happen when the view is
@@ -26,11 +27,11 @@ export class MethodModelingViewProvider implements WebviewViewProvider {
2627
) {
2728
webviewView.webview.options = {
2829
enableScripts: true,
29-
localResourceRoots: [this.context.extensionUri],
30+
localResourceRoots: [Uri.file(this.app.extensionPath)],
3031
};
3132

3233
const html = getHtmlForWebview(
33-
this.context,
34+
this.app,
3435
webviewView.webview,
3536
"method-modeling",
3637
{

extensions/ql-vscode/src/model-editor/model-editor-module.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { ExtensionContext } from "vscode";
21
import { ModelEditorView } from "./model-editor-view";
32
import { ModelEditorCommands } from "../common/commands";
43
import { CliVersionConstraint, CodeQLCliServer } from "../codeql-cli/cli";
@@ -31,7 +30,6 @@ export class ModelEditorModule extends DisposableObject {
3130
private mostRecentlyActiveView: ModelEditorView | undefined = undefined;
3231

3332
private constructor(
34-
private readonly ctx: ExtensionContext,
3533
private readonly app: App,
3634
private readonly databaseManager: DatabaseManager,
3735
private readonly cliServer: CodeQLCliServer,
@@ -41,7 +39,7 @@ export class ModelEditorModule extends DisposableObject {
4139
super();
4240
this.queryStorageDir = join(baseQueryStorageDir, "model-editor-results");
4341
this.methodsUsagePanel = this.push(new MethodsUsagePanel(cliServer));
44-
this.methodModelingPanel = this.push(new MethodModelingPanel(ctx));
42+
this.methodModelingPanel = this.push(new MethodModelingPanel(app));
4543
}
4644

4745
private handleViewBecameActive(view: ModelEditorView): void {
@@ -59,15 +57,13 @@ export class ModelEditorModule extends DisposableObject {
5957
}
6058

6159
public static async initialize(
62-
ctx: ExtensionContext,
6360
app: App,
6461
databaseManager: DatabaseManager,
6562
cliServer: CodeQLCliServer,
6663
queryRunner: QueryRunner,
6764
queryStorageDir: string,
6865
): Promise<ModelEditorModule> {
6966
const modelEditorModule = new ModelEditorModule(
70-
ctx,
7167
app,
7268
databaseManager,
7369
cliServer,
@@ -153,7 +149,6 @@ export class ModelEditorModule extends DisposableObject {
153149
});
154150

155151
const view = new ModelEditorView(
156-
this.ctx,
157152
this.app,
158153
this.databaseManager,
159154
this.cliServer,

extensions/ql-vscode/src/model-editor/model-editor-view.ts

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
1-
import {
2-
CancellationTokenSource,
3-
ExtensionContext,
4-
Uri,
5-
ViewColumn,
6-
window,
7-
} from "vscode";
1+
import { CancellationTokenSource, Uri, ViewColumn, window } from "vscode";
82
import {
93
AbstractWebview,
104
WebviewPanelConfig,
@@ -37,7 +31,6 @@ import { ExtensionPack } from "./shared/extension-pack";
3731
import { showFlowGeneration, showLlmGeneration } from "../config";
3832
import { Mode } from "./shared/mode";
3933
import { loadModeledMethods, saveModeledMethods } from "./modeled-method-fs";
40-
import { join } from "path";
4134
import { pickExtensionPack } from "./extension-pack-picker";
4235
import { getLanguageDisplayName } from "../common/query-language";
4336
import { AutoModeler } from "./auto-modeler";
@@ -54,8 +47,7 @@ export class ModelEditorView extends AbstractWebview<
5447
private hideModeledMethods: boolean;
5548

5649
public constructor(
57-
ctx: ExtensionContext,
58-
private readonly app: App,
50+
protected readonly app: App,
5951
private readonly databaseManager: DatabaseManager,
6052
private readonly cliServer: CodeQLCliServer,
6153
private readonly queryRunner: QueryRunner,
@@ -79,7 +71,7 @@ export class ModelEditorView extends AbstractWebview<
7971
view: ModelEditorView,
8072
) => boolean,
8173
) {
82-
super(ctx);
74+
super(app);
8375

8476
this.autoModeler = new AutoModeler(
8577
app,
@@ -158,11 +150,13 @@ export class ModelEditorView extends AbstractWebview<
158150
preserveFocus: true,
159151
view: "model-editor",
160152
iconPath: {
161-
dark: Uri.file(
162-
join(this.ctx.extensionPath, "media/dark/symbol-misc.svg"),
153+
dark: Uri.joinPath(
154+
Uri.file(this.app.extensionPath),
155+
"media/dark/symbol-misc.svg",
163156
),
164-
light: Uri.file(
165-
join(this.ctx.extensionPath, "media/light/symbol-misc.svg"),
157+
light: Uri.joinPath(
158+
Uri.file(this.app.extensionPath),
159+
"media/light/symbol-misc.svg",
166160
),
167161
},
168162
};
@@ -493,7 +487,6 @@ export class ModelEditorView extends AbstractWebview<
493487
}
494488

495489
const view = new ModelEditorView(
496-
this.ctx,
497490
this.app,
498491
this.databaseManager,
499492
this.cliServer,

0 commit comments

Comments
 (0)