"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const CSSStyleSheet_1 = __importDefault(require("../../css/CSSStyleSheet")); const ResourceFetchHandler_1 = __importDefault(require("../../fetch/ResourceFetchHandler")); const HTMLElement_1 = __importDefault(require("../html-element/HTMLElement")); const Event_1 = __importDefault(require("../../event/Event")); const ErrorEvent_1 = __importDefault(require("../../event/events/ErrorEvent")); const DOMTokenList_1 = __importDefault(require("../../dom-token-list/DOMTokenList")); /** * HTML Link Element. * * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLLinkElement. */ class HTMLLinkElement extends HTMLElement_1.default { constructor() { super(...arguments); this.onerror = null; this.onload = null; this.sheet = null; this._evaluateCSS = true; this._relList = null; } /** * Returns rel list. * * @returns Rel list. */ get relList() { if (!this._relList) { this._relList = new DOMTokenList_1.default(this, 'rel'); } return this._relList; } /** * Returns as. * * @returns As. */ get as() { return this.getAttributeNS(null, 'as') || ''; } /** * Sets crossOrigin. * * @param crossOrigin CrossOrigin. */ set as(as) { this.setAttributeNS(null, 'as', as); } /** * Returns crossOrigin. * * @returns CrossOrigin. */ get crossOrigin() { return this.getAttribute('crossorigin') || ''; } /** * Sets crossOrigin. * * @param crossOrigin CrossOrigin. */ set crossOrigin(crossOrigin) { this.setAttributeNS(null, 'crossorigin', crossOrigin); } /** * Returns href. * * @returns Href. */ get href() { return this.getAttributeNS(null, 'href') || ''; } /** * Sets href. * * @param href Href. */ set href(href) { this.setAttributeNS(null, 'href', href); } /** * Returns hreflang. * * @returns Hreflang. */ get hreflang() { return this.getAttributeNS(null, 'hreflang') || ''; } /** * Sets hreflang. * * @param hreflang Hreflang. */ set hreflang(hreflang) { this.setAttributeNS(null, 'hreflang', hreflang); } /** * Returns media. * * @returns Media. */ get media() { return this.getAttributeNS(null, 'media') || ''; } /** * Sets media. * * @param media Media. */ set media(media) { this.setAttributeNS(null, 'media', media); } /** * Returns referrerPolicy. * * @returns ReferrerPolicy. */ get referrerPolicy() { return this.getAttribute('referrerPolicy') || ''; } /** * Sets referrerPolicy. * * @param referrerPolicy ReferrerPolicy. */ set referrerPolicy(referrerPolicy) { this.setAttributeNS(null, 'referrerPolicy', referrerPolicy); } /** * Returns rel. * * @returns Rel. */ get rel() { return this.getAttributeNS(null, 'rel') || ''; } /** * Sets rel. * * @param rel Rel. */ set rel(rel) { this.setAttributeNS(null, 'rel', rel); } /** * Returns type. * * @returns Type. */ get type() { return this.getAttributeNS(null, 'type') || ''; } /** * Sets type. * * @param type Type. */ set type(type) { this.setAttributeNS(null, 'type', type); } /** * @override */ setAttributeNode(attribute) { const replacedAttribute = super.setAttributeNode(attribute); const rel = this.getAttributeNS(null, 'rel'); const href = this.getAttributeNS(null, 'href'); if (attribute.name === 'rel' && this._relList) { this._relList._updateIndices(); } if ((attribute.name === 'rel' || attribute.name === 'href') && href !== null && rel && rel.toLowerCase() === 'stylesheet' && this.isConnected && !this.ownerDocument.defaultView.happyDOM.settings.disableCSSFileLoading) { this.ownerDocument._readyStateManager.startTask(); ResourceFetchHandler_1.default.fetch(this.ownerDocument, href) .then((code) => { const styleSheet = new CSSStyleSheet_1.default(); styleSheet.replaceSync(code); this.sheet = styleSheet; this.dispatchEvent(new Event_1.default('load')); this.ownerDocument._readyStateManager.endTask(); }) .catch((error) => { this.dispatchEvent(new ErrorEvent_1.default('error', { message: error.message, error })); this.ownerDocument.defaultView.dispatchEvent(new ErrorEvent_1.default('error', { message: error.message, error })); this.ownerDocument._readyStateManager.endTask(); if (!this['_listeners']['error'] && !this.ownerDocument.defaultView['_listeners']['error']) { this.ownerDocument.defaultView.console.error(error); } }); } return replacedAttribute; } /** * @override */ removeAttributeNode(attribute) { super.removeAttributeNode(attribute); if (attribute.name === 'rel' && this._relList) { this._relList._updateIndices(); } return attribute; } /** * @override */ _connectToNode(parentNode = null) { const isConnected = this.isConnected; const isParentConnected = parentNode ? parentNode.isConnected : false; super._connectToNode(parentNode); if (isParentConnected && isConnected !== isParentConnected && this._evaluateCSS && !this.ownerDocument.defaultView.happyDOM.settings.disableCSSFileLoading) { const href = this.getAttributeNS(null, 'href'); const rel = this.getAttributeNS(null, 'rel'); if (href !== null && rel && rel.toLowerCase() === 'stylesheet') { this.ownerDocument._readyStateManager.startTask(); ResourceFetchHandler_1.default.fetch(this.ownerDocument, href) .then((code) => { const styleSheet = new CSSStyleSheet_1.default(); styleSheet.replaceSync(code); this.sheet = styleSheet; this.dispatchEvent(new Event_1.default('load')); this.ownerDocument._readyStateManager.endTask(); }) .catch((error) => { this.dispatchEvent(new ErrorEvent_1.default('error', { message: error.message, error })); this.ownerDocument.defaultView.dispatchEvent(new ErrorEvent_1.default('error', { message: error.message, error })); this.ownerDocument._readyStateManager.endTask(); if (!this['_listeners']['error'] && !this.ownerDocument.defaultView['_listeners']['error']) { this.ownerDocument.defaultView.console.error(error); } }); } } } } exports.default = HTMLLinkElement; //# sourceMappingURL=HTMLLinkElement.js.map