codigo0/node_modules/happy-dom/lib/browser/utilities/BrowserFrameFactory.js
planetazuzu 5d7a6500fe refactor: Fase 1 - Clean Architecture, refactorización modular y eliminación de duplicidades
-  Ticket 1.1: Estructura Clean Architecture en backend
-  Ticket 1.2: Schemas Zod compartidos
-  Ticket 1.3: Refactorización drugs.ts (1362 → 8 archivos modulares)
-  Ticket 1.4: Refactorización procedures.ts (3583 → 6 archivos modulares)
-  Ticket 1.5: Eliminación de duplicidades (~50 líneas)

Cambios principales:
- Creada estructura Clean Architecture en backend/src/
- Schemas Zod compartidos en backend/src/shared/schemas/
- Refactorización modular de drugs y procedures
- Utilidades genéricas en src/utils/ (filter, validation)
- Eliminados scripts obsoletos y documentación antigua
- Corregidos errores: QueryClient, import test-error-handling
- Build verificado y funcionando correctamente
2026-01-25 21:09:47 +01:00

89 lines
3.3 KiB
JavaScript

import * as PropertySymbol from '../../PropertySymbol.js';
/**
* Browser frame factory.
*/
export default class BrowserFrameFactory {
/**
* Creates a new frame.
*
* @param parentFrame Parent frame.
* @returns Frame.
*/
static createChildFrame(parentFrame) {
const frame = new parentFrame.constructor(parentFrame.page);
frame.parentFrame = parentFrame;
parentFrame.childFrames.push(frame);
return frame;
}
/**
* Aborts all ongoing operations and destroys the frame.
*
* @param frame Frame.
*/
static destroyFrame(frame) {
const exceptionObserver = frame.page.context.browser[PropertySymbol.exceptionObserver];
if (frame.closed) {
return Promise.resolve();
}
frame.closed = true;
// Using Promise instead of async/await to prevent usage of a microtask
return new Promise((resolve, reject) => {
if (!frame.window) {
resolve();
return;
}
if (frame.parentFrame) {
const index = frame.parentFrame.childFrames.indexOf(frame);
if (index !== -1) {
frame.parentFrame.childFrames.splice(index, 1);
}
}
if (!frame.childFrames.length) {
frame[PropertySymbol.asyncTaskManager]
.destroy()
.then(() => {
if (exceptionObserver && frame.window) {
exceptionObserver.disconnect(frame.window);
}
frame.window = { closed: true };
frame[PropertySymbol.openerFrame] = null;
frame[PropertySymbol.openerWindow] = null;
// Clear navigation listeners
if (frame[PropertySymbol.listeners]) {
frame[PropertySymbol.listeners].navigation = [];
}
resolve();
})
.catch((error) => reject(error));
if (frame.window) {
frame.window[PropertySymbol.destroy]();
}
return;
}
Promise.all(frame.childFrames.slice().map((childFrame) => this.destroyFrame(childFrame)))
.then(() => {
frame[PropertySymbol.asyncTaskManager]
.destroy()
.then(() => {
if (exceptionObserver && frame.window) {
exceptionObserver.disconnect(frame.window);
}
frame.window = { closed: true };
frame[PropertySymbol.openerFrame] = null;
frame[PropertySymbol.openerWindow] = null;
// Clear navigation listeners
if (frame[PropertySymbol.listeners]) {
frame[PropertySymbol.listeners].navigation = [];
}
resolve();
})
.catch((error) => reject(error));
if (frame.window) {
frame.window[PropertySymbol.destroy]();
}
})
.catch((error) => reject(error));
});
}
}
//# sourceMappingURL=BrowserFrameFactory.js.map