refactor: use Map instead of Object for better semantics (#25982)

This commit is contained in:
Milan Burda 2020-10-19 02:24:51 +02:00 committed by GitHub
parent eca53aaaf1
commit 321395d96e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 34 deletions

View file

@ -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;

View file

@ -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();
} }

View file

@ -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;
}; };