Skip to content

Commit 6d04877

Browse files
Integrate codicons with webviews
This commit adds a reference to the codicons CSS file to enable codicons inside the TraceViewPanel of the vs-code trace extension. It follows the example provided in the vs-code webview sample [1]. [1] https://github.com/microsoft/vscode-extension-samples/tree/main/webview-codicons-sample Fixes #89. Signed-off-by: Hoang Thuan Pham <hoang.pham@calian.ca>
1 parent 4f0ade8 commit 6d04877

File tree

8 files changed

+228
-16
lines changed

8 files changed

+228
-16
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"start:openvscode-server": "cd test-resources/openvscode-server-v1.77.3-linux-x64/bin/; ./openvscode-server ${0}"
1515
},
1616
"devDependencies": {
17+
"copy-webpack-plugin": "^11.0.0",
1718
"lerna": "^3.20.2"
1819
},
1920
"workspaces": [

vscode-trace-extension/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@
137137
"@fortawesome/fontawesome-svg-core": "^1.2.17",
138138
"@fortawesome/free-solid-svg-icons": "^5.8.1",
139139
"@fortawesome/react-fontawesome": "^0.1.4",
140+
"@vscode/codicons": "^0.0.33",
140141
"ag-grid-community": "^28.2.0",
141142
"ag-grid-react": "^28.2.0",
142143
"chart.js": "^2.8.0",

vscode-trace-extension/src/trace-explorer/available-views/trace-explorer-available-views-webview-provider.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ export class TraceExplorerAvailableViewsProvider implements vscode.WebviewViewPr
4141
enableScripts: true,
4242

4343
localResourceRoots: [
44-
vscode.Uri.joinPath(this._extensionUri, 'pack')
44+
vscode.Uri.joinPath(this._extensionUri, 'pack'),
45+
vscode.Uri.joinPath(this._extensionUri, 'lib', 'codicons')
4546
]
4647
};
4748

@@ -110,6 +111,7 @@ export class TraceExplorerAvailableViewsProvider implements vscode.WebviewViewPr
110111
private _getHtmlForWebview(webview: vscode.Webview) {
111112
// Get the local path to main script run in the webview, then convert it to a uri we can use in the webview.
112113
const scriptUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'pack', 'analysisPanel.js'));
114+
const codiconsUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'lib', 'codicons', 'codicon.css'));
113115

114116
// Use a nonce to only allow a specific script to be run.
115117
const nonce = getNonce();
@@ -121,7 +123,14 @@ export class TraceExplorerAvailableViewsProvider implements vscode.WebviewViewPr
121123
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
122124
<meta name="theme-color" content="#000000">
123125
<title>React App</title>
124-
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src vscode-resource: https:; script-src 'nonce-${nonce}' 'unsafe-eval';style-src vscode-resource: 'unsafe-inline' http: https: data:;connect-src ${getTraceServerUrl()};">
126+
<meta http-equiv="Content-Security-Policy"
127+
content="default-src 'none';
128+
img-src vscode-resource: https:;
129+
script-src 'nonce-${nonce}' 'unsafe-eval';
130+
style-src ${webview.cspSource} vscode-resource: 'unsafe-inline' http: https: data:;
131+
connect-src ${getTraceServerUrl()};
132+
font-src ${webview.cspSource}">
133+
<link href="${codiconsUri}" rel="stylesheet" />
125134
<base href="${vscode.Uri.joinPath(this._extensionUri, 'pack').with({ scheme: 'vscode-resource' })}/">
126135
</head>
127136

vscode-trace-extension/src/trace-explorer/opened-traces/trace-explorer-opened-traces-webview-provider.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ export class TraceExplorerOpenedTracesViewProvider implements vscode.WebviewView
7070
enableScripts: true,
7171

7272
localResourceRoots: [
73-
vscode.Uri.joinPath(this._extensionUri, 'pack')
73+
vscode.Uri.joinPath(this._extensionUri, 'pack'),
74+
vscode.Uri.joinPath(this._extensionUri, 'lib', 'codicons')
7475
]
7576
};
7677

@@ -138,6 +139,7 @@ export class TraceExplorerOpenedTracesViewProvider implements vscode.WebviewView
138139
private _getHtmlForWebview(webview: vscode.Webview) {
139140
// Get the local path to main script run in the webview, then convert it to a uri we can use in the webview.
140141
const scriptUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'pack', 'openedTracesPanel.js'));
142+
const codiconsUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'lib', 'codicons', 'codicon.css'));
141143

142144
// Use a nonce to only allow a specific script to be run.
143145
const nonce = getNonce();
@@ -149,7 +151,14 @@ export class TraceExplorerOpenedTracesViewProvider implements vscode.WebviewView
149151
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
150152
<meta name="theme-color" content="#000000">
151153
<title>React App</title>
152-
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src vscode-resource: https:; script-src 'nonce-${nonce}' 'unsafe-eval';style-src vscode-resource: 'unsafe-inline' http: https: data:;connect-src ${getTraceServerUrl()};">
154+
<meta http-equiv="Content-Security-Policy"
155+
content="default-src 'none';
156+
img-src vscode-resource: https:;
157+
script-src 'nonce-${nonce}' 'unsafe-eval';
158+
style-src ${webview.cspSource} vscode-resource: 'unsafe-inline' http: https: data:;
159+
connect-src ${getTraceServerUrl()};
160+
font-src ${webview.cspSource}">
161+
<link href="${codiconsUri}" rel="stylesheet" />
153162
<base href="${vscode.Uri.joinPath(this._extensionUri, 'pack').with({ scheme: 'vscode-resource' })}/">
154163
</head>
155164

vscode-trace-extension/src/trace-explorer/properties/trace-explorer-properties-view-webview-provider.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ export class TraceExplorerItemPropertiesProvider implements vscode.WebviewViewPr
2020
webviewView.webview.options = {
2121
// Allow scripts in the webview
2222
enableScripts: true,
23-
localResourceRoots: [vscode.Uri.joinPath(this._extensionUri, 'pack')],
23+
localResourceRoots: [
24+
vscode.Uri.joinPath(this._extensionUri, 'pack'),
25+
vscode.Uri.joinPath(this._extensionUri, 'lib', 'codicons')
26+
]
2427
};
2528
webviewView.webview.html = this._getHtmlForWebview(webviewView.webview);
2629
}
@@ -35,6 +38,7 @@ export class TraceExplorerItemPropertiesProvider implements vscode.WebviewViewPr
3538
private _getHtmlForWebview(webview: vscode.Webview) {
3639
// Get the local path to main script run in the webview, then convert it to a uri we can use in the webview.
3740
const scriptUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'pack', 'propertiesPanel.js'));
41+
const codiconsUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'lib', 'codicons', 'codicon.css'));
3842

3943
// Use a nonce to only allow a specific script to be run.
4044
const nonce = getNonce();
@@ -46,8 +50,15 @@ export class TraceExplorerItemPropertiesProvider implements vscode.WebviewViewPr
4650
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
4751
<meta name="theme-color" content="#000000">
4852
<title>React App</title>
49-
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src vscode-resource: https:; script-src 'nonce-${nonce}' 'unsafe-eval';style-src vscode-resource: 'unsafe-inline' http: https: data:;connect-src ${getTraceServerUrl()};">
50-
<base href="${vscode.Uri.joinPath(this._extensionUri, 'pack').with({ scheme: 'vscode-resource' })}/">
53+
<meta http-equiv="Content-Security-Policy"
54+
content="default-src 'none';
55+
img-src vscode-resource: https:;
56+
script-src 'nonce-${nonce}' 'unsafe-eval';
57+
style-src ${webview.cspSource} vscode-resource: 'unsafe-inline' http: https: data:;
58+
connect-src ${getTraceServerUrl()};
59+
font-src ${webview.cspSource}">
60+
<link href="${codiconsUri}" rel="stylesheet" />
61+
<base href="${vscode.Uri.joinPath(this._extensionUri, 'pack').with({ scheme: 'vscode-resource' })}/">
5162
</head>
5263
5364
<body>

vscode-trace-extension/src/trace-viewer-panel/trace-viewer-webview-panel.ts

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ export class TraceViewerPanel {
115115

116116
// And restrict the webview to only loading content from our extension's `media` directory.
117117
localResourceRoots: [
118-
vscode.Uri.joinPath(this._extensionUri, 'pack')
118+
vscode.Uri.joinPath(this._extensionUri, 'pack'),
119+
vscode.Uri.joinPath(this._extensionUri, 'lib', 'codicons'),
119120
]
120121
});
121122

@@ -242,6 +243,10 @@ export class TraceViewerPanel {
242243
}
243244

244245
private _getHtmlForWebview() {
246+
const webview = this._panel.webview;
247+
const codiconsUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'lib', 'codicons', 'codicon.css'));
248+
const nonce = getNonce();
249+
245250
try {
246251
return this._getReactHtmlForWebview();
247252
} catch (e) {
@@ -252,6 +257,14 @@ export class TraceViewerPanel {
252257
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
253258
<meta name="theme-color" content="#000000">
254259
<title>React App</title>
260+
<meta http-equiv="Content-Security-Policy"
261+
content="default-src 'none';
262+
img-src vscode-resource: https:;
263+
script-src 'nonce-${nonce}' 'unsafe-eval';
264+
style-src ${webview.cspSource} vscode-resource: 'unsafe-inline' http: https: data:;
265+
connect-src ${getTraceServerUrl()};
266+
font-src ${webview.cspSource}">
267+
<link href="${codiconsUri}" rel="stylesheet" />
255268
<base href="${vscode.Uri.joinPath(this._extensionUri, 'pack').with({ scheme: 'vscode-resource' })}/">
256269
</head>
257270
@@ -271,6 +284,10 @@ export class TraceViewerPanel {
271284
// const stylePathOnDisk = vscode.Uri.file(path.join(this._extensionPath, 'build', mainStyle));
272285
// const styleUri = stylePathOnDisk.with({ scheme: 'vscode-resource' });
273286

287+
// Fetching codicons styles
288+
const webview = this._panel.webview;
289+
const codiconsUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'lib', 'codicons', 'codicon.css'));
290+
274291
// Use a nonce to whitelist which scripts can be run
275292
const nonce = getNonce();
276293

@@ -281,7 +298,14 @@ export class TraceViewerPanel {
281298
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
282299
<meta name="theme-color" content="#000000">
283300
<title>React App</title>
284-
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src vscode-resource: https:; script-src 'nonce-${nonce}' 'unsafe-eval';style-src vscode-resource: 'unsafe-inline' http: https: data:;connect-src ${getTraceServerUrl()};">
301+
<meta http-equiv="Content-Security-Policy"
302+
content="default-src 'none';
303+
img-src vscode-resource: https:;
304+
script-src 'nonce-${nonce}' 'unsafe-eval';
305+
style-src ${webview.cspSource} vscode-resource: 'unsafe-inline' http: https: data:;
306+
connect-src ${getTraceServerUrl()};
307+
font-src ${webview.cspSource}">
308+
<link href="${codiconsUri}" rel="stylesheet" />
285309
<base href="${vscode.Uri.joinPath(this._extensionUri, 'pack').with({ scheme: 'vscode-resource' })}/">
286310
</head>
287311

vscode-trace-extension/webpack.config.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
'use strict';
22

33
const path = require('path');
4+
const CopyPlugin = require("copy-webpack-plugin");
5+
6+
/**
7+
* Path to Codicons css and ttf files.
8+
*/
9+
const codiconsCssPath = path.resolve(__dirname, '..', 'node_modules', '@vscode', 'codicons', 'dist', 'codicon.css');
10+
const codiconsFontPath = path.resolve(__dirname, '..', 'node_modules', '@vscode', 'codicons', 'dist', 'codicon.ttf');
411

512
/**@type {import('webpack').Configuration}*/
613
const config = {
@@ -65,6 +72,14 @@ const config = {
6572
}
6673
]
6774
},
75+
plugins: [
76+
new CopyPlugin({
77+
patterns: [
78+
{ from: codiconsCssPath, to: "./codicons" }, // Copy codicons css and font files to lib/codicons so that they are packaged with the extension
79+
{ from: codiconsFontPath, to: "./codicons" }
80+
],
81+
}),
82+
]
6883
}
6984

7085
module.exports = config;

0 commit comments

Comments
 (0)