@theia/core
Version:
Theia is a cloud & desktop IDE framework implemented in TypeScript.
280 lines • 14.2 kB
JavaScript
// *****************************************************************************
// Copyright (C) 2023 STMicroelectronics and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// http://www.eclipse.org/legal/epl-2.0.
//
// This Source Code may also be made available under the following Secondary
// Licenses when the conditions for such availability set forth in the Eclipse
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
// with the GNU Classpath Exception which is available at
// https://www.gnu.org/software/classpath/license.html.
//
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
// *****************************************************************************
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TheiaRendererAPI = exports.TheiaMainApi = void 0;
const electron_1 = require("@theia/electron/shared/electron");
const nativeKeymap = require("@theia/electron/shared/native-keymap");
const inversify_1 = require("inversify");
const electron_token_1 = require("../electron-common/electron-token");
const electron_api_1 = require("../electron-common/electron-api");
const common_1 = require("../common");
const event_utils_1 = require("./event-utils");
let TheiaMainApi = class TheiaMainApi {
constructor() {
this.openPopups = new Map();
}
onStart(application) {
// electron security token
electron_1.ipcMain.on(electron_api_1.CHANNEL_GET_SECURITY_TOKEN, event => {
event.returnValue = this.electronSecurityToken.value;
});
electron_1.ipcMain.handle(electron_api_1.CHANNEL_ATTACH_SECURITY_TOKEN, (event, endpoint) => electron_1.session.defaultSession.cookies.set({
url: endpoint,
name: electron_token_1.ElectronSecurityToken,
value: JSON.stringify(this.electronSecurityToken),
httpOnly: true,
sameSite: 'no_restriction'
}));
// application menu
electron_1.ipcMain.on(electron_api_1.CHANNEL_SET_MENU, (event, menuId, menu) => {
var _a;
let electronMenu;
if (menu) {
electronMenu = electron_1.Menu.buildFromTemplate(this.fromMenuDto(event.sender, menuId, menu));
}
else {
// eslint-disable-next-line no-null/no-null
electronMenu = null;
}
if (common_1.isOSX) {
electron_1.Menu.setApplicationMenu(electronMenu);
}
else {
(_a = electron_1.BrowserWindow.fromWebContents(event.sender)) === null || _a === void 0 ? void 0 : _a.setMenu(electronMenu);
}
});
electron_1.ipcMain.on(electron_api_1.CHANNEL_SET_MENU_BAR_VISIBLE, (event, visible, windowName) => {
let electronWindow;
if (windowName) {
electronWindow = electron_1.BrowserWindow.getAllWindows().find(win => win.webContents.mainFrame.name === windowName);
}
else {
electronWindow = electron_1.BrowserWindow.fromWebContents(event.sender);
}
if (electronWindow) {
electronWindow.setMenuBarVisibility(visible);
}
else {
console.warn(`There is no known secondary window '${windowName}'. Thus, the menu bar could not be made visible.`);
}
});
// popup menu
electron_1.ipcMain.handle(electron_api_1.CHANNEL_OPEN_POPUP, (event, menuId, menu, x, y) => {
const zoom = event.sender.getZoomFactor();
// TODO: Remove the offset once Electron fixes https://github.com/electron/electron/issues/31641
const offset = process.platform === 'win32' ? 0 : 2;
// x and y values must be Ints or else there is a conversion error
x = Math.round(x * zoom) + offset;
y = Math.round(y * zoom) + offset;
const popup = electron_1.Menu.buildFromTemplate(this.fromMenuDto(event.sender, menuId, menu));
this.openPopups.set(menuId, popup);
popup.popup({
callback: () => {
this.openPopups.delete(menuId);
event.sender.send(electron_api_1.CHANNEL_ON_CLOSE_POPUP, menuId);
}
});
});
electron_1.ipcMain.handle(electron_api_1.CHANNEL_CLOSE_POPUP, (event, handle) => {
if (this.openPopups.has(handle)) {
this.openPopups.get(handle).closePopup();
}
});
// focus windows for secondary window support
electron_1.ipcMain.on(electron_api_1.CHANNEL_FOCUS_WINDOW, (event, windowName) => {
const electronWindow = electron_1.BrowserWindow.getAllWindows().find(win => win.webContents.mainFrame.name === windowName);
if (electronWindow) {
if (electronWindow.isMinimized()) {
electronWindow.restore();
}
electronWindow.focus();
}
else {
console.warn(`There is no known secondary window '${windowName}'. Thus, the window could not be focussed.`);
}
});
electron_1.ipcMain.on(electron_api_1.CHANNEL_SHOW_ITEM_IN_FOLDER, (event, fsPath) => {
electron_1.shell.showItemInFolder(fsPath);
});
electron_1.ipcMain.handle(electron_api_1.CHANNEL_GET_TITLE_STYLE_AT_STARTUP, event => application.getTitleBarStyleAtStartup(event.sender));
electron_1.ipcMain.on(electron_api_1.CHANNEL_SET_TITLE_STYLE, (event, style) => application.setTitleBarStyle(event.sender, style));
electron_1.ipcMain.on(electron_api_1.CHANNEL_SET_BACKGROUND_COLOR, (event, backgroundColor) => application.setBackgroundColor(event.sender, backgroundColor));
electron_1.ipcMain.on(electron_api_1.CHANNEL_MINIMIZE, event => {
var _a;
(_a = electron_1.BrowserWindow.fromWebContents(event.sender)) === null || _a === void 0 ? void 0 : _a.minimize();
});
electron_1.ipcMain.on(electron_api_1.CHANNEL_IS_MAXIMIZED, event => {
var _a;
event.returnValue = (_a = electron_1.BrowserWindow.fromWebContents(event.sender)) === null || _a === void 0 ? void 0 : _a.isMaximized();
});
electron_1.ipcMain.on(electron_api_1.CHANNEL_MAXIMIZE, event => {
var _a;
(_a = electron_1.BrowserWindow.fromWebContents(event.sender)) === null || _a === void 0 ? void 0 : _a.maximize();
});
electron_1.ipcMain.on(electron_api_1.CHANNEL_UNMAXIMIZE, event => {
var _a;
(_a = electron_1.BrowserWindow.fromWebContents(event.sender)) === null || _a === void 0 ? void 0 : _a.unmaximize();
});
electron_1.ipcMain.on(electron_api_1.CHANNEL_CLOSE, event => {
var _a;
(_a = electron_1.BrowserWindow.fromWebContents(event.sender)) === null || _a === void 0 ? void 0 : _a.close();
});
electron_1.ipcMain.on(electron_api_1.CHANNEL_RESTART, event => {
application.restart(event.sender);
});
electron_1.ipcMain.on(electron_api_1.CHANNEL_TOGGLE_DEVTOOLS, event => {
event.sender.toggleDevTools();
});
electron_1.ipcMain.on(electron_api_1.CHANNEL_SET_ZOOM_LEVEL, (event, zoomLevel) => {
event.sender.setZoomLevel(zoomLevel);
});
electron_1.ipcMain.handle(electron_api_1.CHANNEL_GET_ZOOM_LEVEL, event => event.sender.getZoomLevel());
electron_1.ipcMain.on(electron_api_1.CHANNEL_TOGGLE_FULL_SCREEN, event => {
const win = electron_1.BrowserWindow.fromWebContents(event.sender);
if (win) {
win.setFullScreen(!win.isFullScreen());
}
});
electron_1.ipcMain.on(electron_api_1.CHANNEL_IS_FULL_SCREENABLE, event => {
var _a;
event.returnValue = (_a = electron_1.BrowserWindow.fromWebContents(event.sender)) === null || _a === void 0 ? void 0 : _a.isFullScreenable();
});
electron_1.ipcMain.on(electron_api_1.CHANNEL_IS_FULL_SCREEN, event => {
var _a;
event.returnValue = (_a = electron_1.BrowserWindow.fromWebContents(event.sender)) === null || _a === void 0 ? void 0 : _a.isFullScreen();
});
electron_1.ipcMain.on(electron_api_1.CHANNEL_READ_CLIPBOARD, event => {
event.returnValue = electron_1.clipboard.readText();
});
electron_1.ipcMain.on(electron_api_1.CHANNEL_WRITE_CLIPBOARD, (event, text) => {
electron_1.clipboard.writeText(text);
});
nativeKeymap.onDidChangeKeyboardLayout(() => {
const newLayout = {
info: nativeKeymap.getCurrentKeyboardLayout(),
mapping: nativeKeymap.getKeyMap()
};
for (const webContent of electron_1.webContents.getAllWebContents()) {
webContent.send('keyboardLayoutChanged', newLayout);
}
});
}
fromMenuDto(sender, menuId, menuDto) {
return menuDto.map(dto => {
const result = {
id: dto.id,
label: dto.label,
type: dto.type,
checked: dto.checked,
enabled: dto.enabled,
visible: dto.visible,
role: dto.role,
accelerator: dto.accelerator
};
if (dto.submenu) {
result.submenu = this.fromMenuDto(sender, menuId, dto.submenu);
}
if (dto.handlerId) {
result.click = () => {
sender.send(electron_api_1.CHANNEL_INVOKE_MENU, menuId, dto.handlerId);
};
}
return result;
});
}
};
__decorate([
(0, inversify_1.inject)(electron_token_1.ElectronSecurityToken),
__metadata("design:type", Object)
], TheiaMainApi.prototype, "electronSecurityToken", void 0);
TheiaMainApi = __decorate([
(0, inversify_1.injectable)()
], TheiaMainApi);
exports.TheiaMainApi = TheiaMainApi;
let nextReplyChannel = 0;
var TheiaRendererAPI;
(function (TheiaRendererAPI) {
function sendWindowEvent(wc, event) {
wc.send(electron_api_1.CHANNEL_ON_WINDOW_EVENT, event);
}
TheiaRendererAPI.sendWindowEvent = sendWindowEvent;
function requestClose(wc, stopReason) {
const channelNr = nextReplyChannel++;
const confirmChannel = `confirm-${channelNr}`;
const cancelChannel = `cancel-${channelNr}`;
const disposables = new common_1.DisposableCollection();
return new Promise(resolve => {
wc.send(electron_api_1.CHANNEL_REQUEST_CLOSE, stopReason, confirmChannel, cancelChannel);
(0, event_utils_1.createDisposableListener)(electron_1.ipcMain, confirmChannel, e => {
resolve(true);
}, disposables);
(0, event_utils_1.createDisposableListener)(electron_1.ipcMain, cancelChannel, e => {
resolve(false);
}, disposables);
}).finally(() => disposables.dispose());
}
TheiaRendererAPI.requestClose = requestClose;
function requestSecondaryClose(mainWindow, secondaryWindow) {
const channelNr = nextReplyChannel++;
const confirmChannel = `confirm-${channelNr}`;
const cancelChannel = `cancel-${channelNr}`;
const disposables = new common_1.DisposableCollection();
return new Promise(resolve => {
mainWindow.send(electron_api_1.CHANNEL_REQUEST_SECONDARY_CLOSE, secondaryWindow.mainFrame.name, confirmChannel, cancelChannel);
(0, event_utils_1.createDisposableListener)(electron_1.ipcMain, confirmChannel, e => {
resolve(true);
}, disposables);
(0, event_utils_1.createDisposableListener)(electron_1.ipcMain, cancelChannel, e => {
resolve(false);
}, disposables);
}).finally(() => disposables.dispose());
}
TheiaRendererAPI.requestSecondaryClose = requestSecondaryClose;
function onRequestReload(wc, handler) {
return createWindowListener(wc, electron_api_1.CHANNEL_REQUEST_RELOAD, handler);
}
TheiaRendererAPI.onRequestReload = onRequestReload;
function onApplicationStateChanged(wc, handler) {
return createWindowListener(wc, electron_api_1.CHANNEL_APP_STATE_CHANGED, state => handler(state));
}
TheiaRendererAPI.onApplicationStateChanged = onApplicationStateChanged;
function onIpcData(handler) {
return (0, event_utils_1.createDisposableListener)(electron_1.ipcMain, electron_api_1.CHANNEL_IPC_CONNECTION, (event, data) => handler(event.sender, data));
}
TheiaRendererAPI.onIpcData = onIpcData;
function sendData(wc, data) {
wc.send(electron_api_1.CHANNEL_IPC_CONNECTION, data);
}
TheiaRendererAPI.sendData = sendData;
function createWindowListener(wc, channel, handler) {
return (0, event_utils_1.createDisposableListener)(electron_1.ipcMain, channel, (event, ...args) => {
if (wc.id === event.sender.id) {
handler(...args);
}
});
}
})(TheiaRendererAPI = exports.TheiaRendererAPI || (exports.TheiaRendererAPI = {}));
//# sourceMappingURL=electron-api-main.js.map
;