refactor: use Map instead of Object for better semantics (#25982)
This commit is contained in:
parent
eca53aaaf1
commit
321395d96e
3 changed files with 30 additions and 34 deletions
|
@ -216,16 +216,16 @@ const makePromiseFunction = function (orig: Function, pathArgumentIndex: number)
|
||||||
|
|
||||||
// Override fs APIs.
|
// Override fs APIs.
|
||||||
export const wrapFsWithAsar = (fs: Record<string, any>) => {
|
export const wrapFsWithAsar = (fs: Record<string, any>) => {
|
||||||
const logFDs: Record<string, number> = {};
|
const logFDs = new Map<string, number>();
|
||||||
const logASARAccess = (asarPath: string, filePath: string, offset: number) => {
|
const logASARAccess = (asarPath: string, filePath: string, offset: number) => {
|
||||||
if (!process.env.ELECTRON_LOG_ASAR_READS) return;
|
if (!process.env.ELECTRON_LOG_ASAR_READS) return;
|
||||||
if (!logFDs[asarPath]) {
|
if (!logFDs.has(asarPath)) {
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const logFilename = `${path.basename(asarPath, '.asar')}-access-log.txt`;
|
const logFilename = `${path.basename(asarPath, '.asar')}-access-log.txt`;
|
||||||
const logPath = path.join(require('os').tmpdir(), logFilename);
|
const logPath = path.join(require('os').tmpdir(), logFilename);
|
||||||
logFDs[asarPath] = fs.openSync(logPath, 'a');
|
logFDs.set(asarPath, fs.openSync(logPath, 'a'));
|
||||||
}
|
}
|
||||||
fs.writeSync(logFDs[asarPath], `${offset}: ${filePath}\n`);
|
fs.writeSync(logFDs.get(asarPath), `${offset}: ${filePath}\n`);
|
||||||
};
|
};
|
||||||
|
|
||||||
const { lstatSync } = fs;
|
const { lstatSync } = fs;
|
||||||
|
|
|
@ -300,8 +300,8 @@ class TouchBar extends EventEmitter implements Electron.TouchBar {
|
||||||
touchBar._addToWindow(window);
|
touchBar._addToWindow(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
private windowListeners: Record<number, Function> = {};
|
private windowListeners = new Map<number, Function>();
|
||||||
private items: Record<string, TouchBarItem<any>> = {};
|
private items = new Map<string, TouchBarItem<any>>();
|
||||||
orderedItems: TouchBarItem<any>[] = [];
|
orderedItems: TouchBarItem<any>[] = [];
|
||||||
|
|
||||||
constructor (options: Electron.TouchBarConstructorOptions) {
|
constructor (options: Electron.TouchBarConstructorOptions) {
|
||||||
|
@ -317,12 +317,10 @@ class TouchBar extends EventEmitter implements Electron.TouchBar {
|
||||||
items = [];
|
items = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
this.windowListeners = {};
|
|
||||||
this.items = {};
|
|
||||||
this.escapeItem = (escapeItem as any) || null;
|
this.escapeItem = (escapeItem as any) || null;
|
||||||
|
|
||||||
const registerItem = (item: TouchBarItem<any>) => {
|
const registerItem = (item: TouchBarItem<any>) => {
|
||||||
this.items[item.id] = item;
|
this.items.set(item.id, item);
|
||||||
item.on('change', this.changeListener);
|
item.on('change', this.changeListener);
|
||||||
if (item.child instanceof TouchBar) {
|
if (item.child instanceof TouchBar) {
|
||||||
item.child.orderedItems.forEach(registerItem);
|
item.child.orderedItems.forEach(registerItem);
|
||||||
|
@ -387,7 +385,7 @@ class TouchBar extends EventEmitter implements Electron.TouchBar {
|
||||||
const { id } = window;
|
const { id } = window;
|
||||||
|
|
||||||
// Already added to window
|
// Already added to window
|
||||||
if (Object.prototype.hasOwnProperty.call(this.windowListeners, id)) return;
|
if (this.windowListeners.has(id)) return;
|
||||||
|
|
||||||
window._touchBar = this;
|
window._touchBar = this;
|
||||||
|
|
||||||
|
@ -402,7 +400,7 @@ class TouchBar extends EventEmitter implements Electron.TouchBar {
|
||||||
this.on('escape-item-change', escapeItemListener);
|
this.on('escape-item-change', escapeItemListener);
|
||||||
|
|
||||||
const interactionListener = (_: any, itemID: string, details: any) => {
|
const interactionListener = (_: any, itemID: string, details: any) => {
|
||||||
let item = this.items[itemID];
|
let item = this.items.get(itemID);
|
||||||
if (item == null && this.escapeItem != null && this.escapeItem.id === itemID) {
|
if (item == null && this.escapeItem != null && this.escapeItem.id === itemID) {
|
||||||
item = this.escapeItem;
|
item = this.escapeItem;
|
||||||
}
|
}
|
||||||
|
@ -418,7 +416,7 @@ class TouchBar extends EventEmitter implements Electron.TouchBar {
|
||||||
window.removeListener('-touch-bar-interaction', interactionListener);
|
window.removeListener('-touch-bar-interaction', interactionListener);
|
||||||
window.removeListener('closed', removeListeners);
|
window.removeListener('closed', removeListeners);
|
||||||
window._touchBar = null;
|
window._touchBar = null;
|
||||||
delete this.windowListeners[id];
|
this.windowListeners.delete(id);
|
||||||
const unregisterItems = (items: TouchBarItem<any>[]) => {
|
const unregisterItems = (items: TouchBarItem<any>[]) => {
|
||||||
for (const item of items) {
|
for (const item of items) {
|
||||||
item.removeListener('change', this.changeListener);
|
item.removeListener('change', this.changeListener);
|
||||||
|
@ -433,14 +431,14 @@ class TouchBar extends EventEmitter implements Electron.TouchBar {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
window.once('closed', removeListeners);
|
window.once('closed', removeListeners);
|
||||||
this.windowListeners[id] = removeListeners;
|
this.windowListeners.set(id, removeListeners);
|
||||||
|
|
||||||
window._setTouchBarItems(this.orderedItems);
|
window._setTouchBarItems(this.orderedItems);
|
||||||
escapeItemListener(this.escapeItem);
|
escapeItemListener(this.escapeItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
_removeFromWindow (window: Electron.BrowserWindow) {
|
_removeFromWindow (window: Electron.BrowserWindow) {
|
||||||
const removeListeners = this.windowListeners[window.id];
|
const removeListeners = this.windowListeners.get(window.id);
|
||||||
if (removeListeners != null) removeListeners();
|
if (removeListeners != null) removeListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,8 +18,8 @@ const webViewManager = process._linkedBinding('electron_browser_web_view_manager
|
||||||
|
|
||||||
const supportedWebViewEvents = Object.keys(webViewEvents);
|
const supportedWebViewEvents = Object.keys(webViewEvents);
|
||||||
|
|
||||||
const guestInstances: Record<string, GuestInstance> = {};
|
const guestInstances = new Map<number, GuestInstance>();
|
||||||
const embedderElementsMap: Record<string, number> = {};
|
const embedderElementsMap = new Map<string, number>();
|
||||||
|
|
||||||
function sanitizeOptionsForGuest (options: Record<string, any>) {
|
function sanitizeOptionsForGuest (options: Record<string, any>) {
|
||||||
const ret = { ...options };
|
const ret = { ...options };
|
||||||
|
@ -37,14 +37,14 @@ const createGuest = function (embedder: Electron.WebContents, params: Record<str
|
||||||
embedder: embedder
|
embedder: embedder
|
||||||
});
|
});
|
||||||
const guestInstanceId = guest.id;
|
const guestInstanceId = guest.id;
|
||||||
guestInstances[guestInstanceId] = {
|
guestInstances.set(guestInstanceId, {
|
||||||
guest: guest,
|
guest: guest,
|
||||||
embedder: embedder
|
embedder: embedder
|
||||||
};
|
});
|
||||||
|
|
||||||
// Clear the guest from map when it is destroyed.
|
// Clear the guest from map when it is destroyed.
|
||||||
guest.once('destroyed', () => {
|
guest.once('destroyed', () => {
|
||||||
if (Object.prototype.hasOwnProperty.call(guestInstances, guestInstanceId)) {
|
if (guestInstances.has(guestInstanceId)) {
|
||||||
detachGuest(embedder, guestInstanceId);
|
detachGuest(embedder, guestInstanceId);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -107,7 +107,7 @@ const createGuest = function (embedder: Electron.WebContents, params: Record<str
|
||||||
// Notify guest of embedder window visibility when it is ready
|
// Notify guest of embedder window visibility when it is ready
|
||||||
// FIXME Remove once https://github.com/electron/electron/issues/6828 is fixed
|
// FIXME Remove once https://github.com/electron/electron/issues/6828 is fixed
|
||||||
guest.on('dom-ready', function () {
|
guest.on('dom-ready', function () {
|
||||||
const guestInstance = guestInstances[guestInstanceId];
|
const guestInstance = guestInstances.get(guestInstanceId);
|
||||||
if (guestInstance != null && guestInstance.visibilityState != null) {
|
if (guestInstance != null && guestInstance.visibilityState != null) {
|
||||||
guest._sendInternal(IPC_MESSAGES.GUEST_INSTANCE_VISIBILITY_CHANGE, guestInstance.visibilityState);
|
guest._sendInternal(IPC_MESSAGES.GUEST_INSTANCE_VISIBILITY_CHANGE, guestInstance.visibilityState);
|
||||||
}
|
}
|
||||||
|
@ -122,20 +122,20 @@ const attachGuest = function (event: Electron.IpcMainInvokeEvent,
|
||||||
const embedder = event.sender;
|
const embedder = event.sender;
|
||||||
// Destroy the old guest when attaching.
|
// Destroy the old guest when attaching.
|
||||||
const key = `${embedder.id}-${elementInstanceId}`;
|
const key = `${embedder.id}-${elementInstanceId}`;
|
||||||
const oldGuestInstanceId = embedderElementsMap[key];
|
const oldGuestInstanceId = embedderElementsMap.get(key);
|
||||||
if (oldGuestInstanceId != null) {
|
if (oldGuestInstanceId != null) {
|
||||||
// Reattachment to the same guest is just a no-op.
|
// Reattachment to the same guest is just a no-op.
|
||||||
if (oldGuestInstanceId === guestInstanceId) {
|
if (oldGuestInstanceId === guestInstanceId) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const oldGuestInstance = guestInstances[oldGuestInstanceId];
|
const oldGuestInstance = guestInstances.get(oldGuestInstanceId);
|
||||||
if (oldGuestInstance) {
|
if (oldGuestInstance) {
|
||||||
oldGuestInstance.guest.detachFromOuterFrame();
|
oldGuestInstance.guest.detachFromOuterFrame();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const guestInstance = guestInstances[guestInstanceId];
|
const guestInstance = guestInstances.get(guestInstanceId);
|
||||||
// If this isn't a valid guest instance then do nothing.
|
// If this isn't a valid guest instance then do nothing.
|
||||||
if (!guestInstance) {
|
if (!guestInstance) {
|
||||||
throw new Error(`Invalid guestInstanceId: ${guestInstanceId}`);
|
throw new Error(`Invalid guestInstanceId: ${guestInstanceId}`);
|
||||||
|
@ -148,7 +148,7 @@ const attachGuest = function (event: Electron.IpcMainInvokeEvent,
|
||||||
// If this guest is already attached to an element then remove it
|
// If this guest is already attached to an element then remove it
|
||||||
if (guestInstance.elementInstanceId) {
|
if (guestInstance.elementInstanceId) {
|
||||||
const oldKey = `${guestInstance.embedder.id}-${guestInstance.elementInstanceId}`;
|
const oldKey = `${guestInstance.embedder.id}-${guestInstance.elementInstanceId}`;
|
||||||
delete embedderElementsMap[oldKey];
|
embedderElementsMap.delete(oldKey);
|
||||||
|
|
||||||
// Remove guest from embedder if moving across web views
|
// Remove guest from embedder if moving across web views
|
||||||
if (guest.viewInstanceId !== params.instanceId) {
|
if (guest.viewInstanceId !== params.instanceId) {
|
||||||
|
@ -210,7 +210,7 @@ const attachGuest = function (event: Electron.IpcMainInvokeEvent,
|
||||||
}
|
}
|
||||||
|
|
||||||
guest.attachParams = params;
|
guest.attachParams = params;
|
||||||
embedderElementsMap[key] = guestInstanceId;
|
embedderElementsMap.set(key, guestInstanceId);
|
||||||
|
|
||||||
guest.setEmbedder(embedder);
|
guest.setEmbedder(embedder);
|
||||||
guestInstance.embedder = embedder;
|
guestInstance.embedder = embedder;
|
||||||
|
@ -224,7 +224,7 @@ const attachGuest = function (event: Electron.IpcMainInvokeEvent,
|
||||||
|
|
||||||
// Remove an guest-embedder relationship.
|
// Remove an guest-embedder relationship.
|
||||||
const detachGuest = function (embedder: Electron.WebContents, guestInstanceId: number) {
|
const detachGuest = function (embedder: Electron.WebContents, guestInstanceId: number) {
|
||||||
const guestInstance = guestInstances[guestInstanceId];
|
const guestInstance = guestInstances.get(guestInstanceId);
|
||||||
|
|
||||||
if (!guestInstance) return;
|
if (!guestInstance) return;
|
||||||
|
|
||||||
|
@ -233,10 +233,10 @@ const detachGuest = function (embedder: Electron.WebContents, guestInstanceId: n
|
||||||
}
|
}
|
||||||
|
|
||||||
webViewManager.removeGuest(embedder, guestInstanceId);
|
webViewManager.removeGuest(embedder, guestInstanceId);
|
||||||
delete guestInstances[guestInstanceId];
|
guestInstances.delete(guestInstanceId);
|
||||||
|
|
||||||
const key = `${embedder.id}-${guestInstance.elementInstanceId}`;
|
const key = `${embedder.id}-${guestInstance.elementInstanceId}`;
|
||||||
delete embedderElementsMap[key];
|
embedderElementsMap.delete(key);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Once an embedder has had a guest attached we watch it for destruction to
|
// Once an embedder has had a guest attached we watch it for destruction to
|
||||||
|
@ -250,8 +250,7 @@ const watchEmbedder = function (embedder: Electron.WebContents) {
|
||||||
|
|
||||||
// Forward embedder window visibility change events to guest
|
// Forward embedder window visibility change events to guest
|
||||||
const onVisibilityChange = function (visibilityState: VisibilityState) {
|
const onVisibilityChange = function (visibilityState: VisibilityState) {
|
||||||
for (const guestInstanceId of Object.keys(guestInstances)) {
|
for (const guestInstance of guestInstances.values()) {
|
||||||
const guestInstance = guestInstances[guestInstanceId];
|
|
||||||
guestInstance.visibilityState = visibilityState;
|
guestInstance.visibilityState = visibilityState;
|
||||||
if (guestInstance.embedder === embedder) {
|
if (guestInstance.embedder === embedder) {
|
||||||
guestInstance.guest._sendInternal(IPC_MESSAGES.GUEST_INSTANCE_VISIBILITY_CHANGE, visibilityState);
|
guestInstance.guest._sendInternal(IPC_MESSAGES.GUEST_INSTANCE_VISIBILITY_CHANGE, visibilityState);
|
||||||
|
@ -264,10 +263,9 @@ const watchEmbedder = function (embedder: Electron.WebContents) {
|
||||||
// Usually the guestInstances is cleared when guest is destroyed, but it
|
// Usually the guestInstances is cleared when guest is destroyed, but it
|
||||||
// may happen that the embedder gets manually destroyed earlier than guest,
|
// may happen that the embedder gets manually destroyed earlier than guest,
|
||||||
// and the embedder will be invalid in the usual code path.
|
// and the embedder will be invalid in the usual code path.
|
||||||
for (const guestInstanceId of Object.keys(guestInstances)) {
|
for (const [guestInstanceId, guestInstance] of guestInstances) {
|
||||||
const guestInstance = guestInstances[guestInstanceId];
|
|
||||||
if (guestInstance.embedder === embedder) {
|
if (guestInstance.embedder === embedder) {
|
||||||
detachGuest(embedder, parseInt(guestInstanceId));
|
detachGuest(embedder, guestInstanceId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Clear the listeners.
|
// Clear the listeners.
|
||||||
|
@ -388,6 +386,6 @@ const getGuestForWebContents = function (guestInstanceId: number, contents: Elec
|
||||||
|
|
||||||
// Returns WebContents from its guest id.
|
// Returns WebContents from its guest id.
|
||||||
const getGuest = function (guestInstanceId: number) {
|
const getGuest = function (guestInstanceId: number) {
|
||||||
const guestInstance = guestInstances[guestInstanceId];
|
const guestInstance = guestInstances.get(guestInstanceId);
|
||||||
if (guestInstance != null) return guestInstance.guest;
|
if (guestInstance != null) return guestInstance.guest;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue