"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const Event_js_1 = __importDefault(require("../../event/Event.cjs")); const ErrorEvent_js_1 = __importDefault(require("../../event/events/ErrorEvent.cjs")); const DOMException_js_1 = __importDefault(require("../../exception/DOMException.cjs")); const DOMExceptionNameEnum_js_1 = __importDefault(require("../../exception/DOMExceptionNameEnum.cjs")); const ResourceFetch_js_1 = __importDefault(require("../../fetch/ResourceFetch.cjs")); /** * Helper class for getting the URL relative to a Location object. */ class HTMLScriptElementUtility { /** * Returns a URL relative to the given Location object. * * @param options Options. * @param options.element Element. * @param element */ static async loadExternalScript(element) { const src = element.getAttribute('src'); const async = element.getAttribute('async') !== null; if (element.ownerDocument.defaultView.happyDOM.settings.disableJavaScriptFileLoading || element.ownerDocument.defaultView.happyDOM.settings.disableJavaScriptEvaluation) { this.onError(element, new DOMException_js_1.default(`Failed to load external script "${src}". JavaScript file loading is disabled.`, DOMExceptionNameEnum_js_1.default.notSupportedError)); return; } if (async) { element.ownerDocument._readyStateManager.startTask(); let code = null; try { code = await ResourceFetch_js_1.default.fetch(element.ownerDocument, src); } catch (error) { this.onError(element, error); return; } this.eval(element, code); element.dispatchEvent(new Event_js_1.default('load')); element.ownerDocument._readyStateManager.endTask(); } else { let code = null; try { code = ResourceFetch_js_1.default.fetchSync(element.ownerDocument, src); } catch (error) { this.onError(element, error); return; } this.eval(element, code); element.dispatchEvent(new Event_js_1.default('load')); } } /** * Evaluates a script code. * * @param element Element. * @param code Code. */ static eval(element, code) { try { element.ownerDocument.defaultView.eval(code); } catch (error) { element.ownerDocument.defaultView.console.error(error); element.ownerDocument.defaultView.dispatchEvent(new ErrorEvent_js_1.default('error', { message: error.message, error: error })); } } /** * Triggered when an error occurs. * * @param element Element. * @param error Error. */ static onError(element, error) { element.dispatchEvent(new ErrorEvent_js_1.default('error', { message: error.message, error })); element.ownerDocument.defaultView.dispatchEvent(new ErrorEvent_js_1.default('error', { message: error.message, error })); if (!element['_listeners']['error'] && !element.ownerDocument.defaultView['_listeners']['error']) { element.ownerDocument.defaultView.console.error(error); } } } exports.default = HTMLScriptElementUtility; //# sourceMappingURL=HTMLScriptElementUtility.cjs.map