Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/browserView/electron-browser/siteInfoWidget.ts
13401 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { localize } from '../../../../nls.js';
7
import { $, addDisposableListener, EventType } from '../../../../base/browser/dom.js';
8
import { renderIcon } from '../../../../base/browser/ui/iconLabel/iconLabels.js';
9
import { Codicon } from '../../../../base/common/codicons.js';
10
import { Disposable } from '../../../../base/common/lifecycle.js';
11
import { IBrowserViewCertificateError } from '../../../../platform/browserView/common/browserView.js';
12
import { IHoverService } from '../../../../platform/hover/browser/hover.js';
13
import { HoverPosition } from '../../../../base/browser/ui/hover/hoverWidget.js';
14
import type { BrowserEditor } from './browserEditor.js';
15
16
/**
17
* Widget that displays site security information (e.g. certificate errors)
18
* as an indicator button inside the URL bar, with a hover popover for details.
19
*/
20
export class SiteInfoWidget extends Disposable {
21
22
private readonly _container: HTMLElement;
23
private readonly _indicator: HTMLElement;
24
25
constructor(
26
parent: HTMLElement,
27
private readonly editor: BrowserEditor,
28
@IHoverService private readonly hoverService: IHoverService
29
) {
30
super();
31
32
this._container = $('.browser-site-info-container');
33
this._container.style.display = 'none';
34
35
this._indicator = $('.browser-site-info-indicator');
36
this._indicator.tabIndex = 0;
37
this._indicator.role = 'button';
38
this._indicator.ariaLabel = localize('browser.notSecure', "Not Secure");
39
this._indicator.appendChild(renderIcon(Codicon.workspaceUntrusted));
40
this._container.appendChild(this._indicator);
41
42
parent.appendChild(this._container);
43
44
this._register(addDisposableListener(this._indicator, EventType.CLICK, () => this._showHover()));
45
this._register(addDisposableListener(this._indicator, EventType.KEY_DOWN, (e: KeyboardEvent) => {
46
if (e.key === 'Enter' || e.key === ' ') {
47
e.preventDefault();
48
this._showHover();
49
}
50
}));
51
}
52
53
/**
54
* Update visibility and state from a certificate error (or lack thereof).
55
*/
56
setCertificateError(certError: IBrowserViewCertificateError | undefined): void {
57
this._container.style.display = certError ? '' : 'none';
58
}
59
60
private _showHover(): void {
61
const certError = this.editor.getCertificateError();
62
if (!certError) {
63
return;
64
}
65
66
const content = document.createElement('div');
67
content.classList.add('browser-site-info-hover-content');
68
69
const heading = document.createElement('div');
70
heading.classList.add('browser-site-info-hover-heading');
71
heading.textContent = localize('browser.certHoverHeading', "Certificate Not Trusted");
72
content.appendChild(heading);
73
74
const detail1 = document.createElement('div');
75
detail1.classList.add('browser-site-info-hover-detail');
76
detail1.textContent = localize(
77
'browser.certHoverDetail1',
78
"Your connection to this site is not secure."
79
);
80
content.appendChild(detail1);
81
82
if (certError.hasTrustedException) {
83
const detail2 = document.createElement('div');
84
detail2.classList.add('browser-site-info-hover-detail');
85
detail2.textContent = localize(
86
'browser.certHoverDetail2',
87
"You previously chose to proceed to '{0}' despite a certificate error ({1}).",
88
certError.host,
89
certError.error
90
);
91
content.appendChild(detail2);
92
93
const revokeLink = document.createElement('a');
94
revokeLink.classList.add('browser-site-info-hover-revoke');
95
revokeLink.textContent = localize('browser.certRevoke', "Revoke and Close");
96
revokeLink.role = 'button';
97
revokeLink.tabIndex = 0;
98
revokeLink.addEventListener('click', () => {
99
hover?.dispose();
100
this.editor.revokeAndClose(certError);
101
});
102
revokeLink.addEventListener('keydown', (e) => {
103
if (e.key === 'Enter' || e.key === ' ') {
104
e.preventDefault();
105
hover?.dispose();
106
this.editor.revokeAndClose(certError);
107
}
108
});
109
content.appendChild(revokeLink);
110
}
111
112
const hover = this.hoverService.showInstantHover({
113
content,
114
target: this._indicator,
115
container: this._container,
116
position: { hoverPosition: HoverPosition.BELOW },
117
persistence: { sticky: true }
118
}, true);
119
}
120
}
121
122