Skip to content

Commit 5ba92b6

Browse files
authored
Deserialize overview in new session (#114)
* Deserialize overview in new session * Auto dispose new disposable * use ExtensionContext.asAbsolutePath * Add more disposables to context.subscriptions
1 parent 3c1f86c commit 5ba92b6

File tree

3 files changed

+39
-12
lines changed

3 files changed

+39
-12
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@
3636
"workspaceContains:build.gradle",
3737
"workspaceContains:mnvw",
3838
"onCommand:java.overview",
39-
"onCommand:java.showLatestReleaseNotes"
39+
"onCommand:java.showLatestReleaseNotes",
40+
"onWebviewPanel:java.overview"
4041
],
4142
"contributes": {
4243
"commands": [

src/extension.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { initialize as initUtils } from "./utils";
88
import { initialize as initCommands } from "./commands";
99
import { initialize as initRecommendations } from "./recommendation";
1010
import { initialize as initMisc, showReleaseNotesOnStart } from "./misc";
11-
import { showOverviewPageOnActivation } from './overview';
11+
import { showOverviewPageOnActivation, OverviewViewSerializer } from './overview';
1212

1313
export async function activate(context: vscode.ExtensionContext) {
1414
initializeTelemetry(context);
@@ -21,6 +21,8 @@ async function initializeExtension(operationId: string, context: vscode.Extensio
2121
initRecommendations(context);
2222
initMisc(context);
2323

24+
context.subscriptions.push(vscode.window.registerWebviewPanelSerializer('java.overview', new OverviewViewSerializer()));
25+
2426
await showOverviewPageOnActivation(context);
2527
await showReleaseNotesOnStart(context);
2628
}

src/overview/index.ts

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import * as path from 'path';
1010
const readFile = util.promisify(fsReadFile);
1111

1212
import { instrumentOperation, sendInfo } from "vscode-extension-telemetry-wrapper";
13+
import { getExtensionContext } from "../utils";
1314

1415
let overviewView: vscode.WebviewPanel | undefined;
1516
const KEY_SHOW_WHEN_USING_JAVA = 'showWhenUsingJava';
@@ -45,30 +46,40 @@ export async function overviewCmdHandler(context: vscode.ExtensionContext, opera
4546

4647
context.globalState.update(KEY_OVERVIEW_LAST_SHOW_TIME, Date.now().toString());
4748

48-
overviewView.iconPath = vscode.Uri.file(path.join(context.extensionPath, 'logo.lowres.png'));
49-
let buffer = await readFile(path.join(context.extensionPath, './out/assets/overview/index.html'));
50-
overviewView.webview.html = buffer.toString();
49+
await initializeOverviewView(context, overviewView, onDidDisposeWebviewPanel);
50+
}
5151

52-
overviewView.onDidDispose(() => {
53-
overviewView = undefined;
54-
});
52+
function onDidDisposeWebviewPanel() {
53+
overviewView = undefined;
54+
}
55+
56+
async function initializeOverviewView(context: vscode.ExtensionContext, webviewPanel: vscode.WebviewPanel, onDisposeCallback: () => void) {
57+
webviewPanel.iconPath = vscode.Uri.file(path.join(context.extensionPath, 'logo.lowres.png'));
58+
webviewPanel.webview.html = await loadHtmlContent(context);
59+
60+
context.subscriptions.push(webviewPanel.onDidDispose(onDisposeCallback));
5561

5662
const installedExtensions = vscode.extensions.all.map(ext => ext.id.toLowerCase());
57-
overviewView.webview.postMessage({
63+
webviewPanel.webview.postMessage({
5864
command: 'hideInstalledExtensions',
5965
installedExtensions: installedExtensions
6066
});
6167

62-
overviewView.webview.postMessage({
68+
webviewPanel.webview.postMessage({
6369
command: 'setOverviewVisibility',
6470
visibility: context.globalState.get(KEY_SHOW_WHEN_USING_JAVA)
6571
});
6672

67-
overviewView.webview.onDidReceiveMessage((e) => {
73+
context.subscriptions.push(webviewPanel.webview.onDidReceiveMessage((e) => {
6874
if (e.command === 'setOverviewVisibility') {
6975
toggleOverviewVisibilityOperation(context, e.visibility);
7076
}
71-
});
77+
}));
78+
}
79+
80+
async function loadHtmlContent(context: vscode.ExtensionContext) {
81+
let buffer = await readFile(context.asAbsolutePath('./out/assets/overview/index.html'));
82+
return buffer.toString();
7283
}
7384

7485
export async function showOverviewPageOnActivation(context: vscode.ExtensionContext) {
@@ -83,3 +94,16 @@ export async function showOverviewPageOnActivation(context: vscode.ExtensionCont
8394
vscode.commands.executeCommand('java.overview', showInBackground);
8495
}
8596
}
97+
98+
export class OverviewViewSerializer implements vscode.WebviewPanelSerializer {
99+
async deserializeWebviewPanel(webviewPanel: vscode.WebviewPanel, state: any) {
100+
if (overviewView) {
101+
overviewView.reveal();
102+
webviewPanel.dispose();
103+
return;
104+
}
105+
106+
overviewView = webviewPanel;
107+
initializeOverviewView(getExtensionContext(), webviewPanel, onDidDisposeWebviewPanel);
108+
}
109+
}

0 commit comments

Comments
 (0)