“use strict”; const HTMLElementImpl = require(“./HTMLElement-impl”).implementation; const LinkStyleImpl = require(“./LinkStyle-impl”).implementation; const idlUtils = require(“../generated/utils”); const reflectURLAttribute = require(“../../utils”).reflectURLAttribute; const fetchStylesheet = require(“../helpers/stylesheets”).fetchStylesheet; const parseURLToResultingURLRecord = require(“../helpers/document-base-url”).parseURLToResultingURLRecord; const whatwgURL = require(“whatwg-url”);
// Important reading: “appropriate times to obtain the resource” in // html.spec.whatwg.org/multipage/semantics.html#link-type-stylesheet
class HTMLLinkElementImpl extends HTMLElementImpl {
_attach() { super._attach(); if (isExternalResourceLink(this)) { obtainTheResource(this); } } _attrModified(name, value, oldValue) { super._attrModified(name, value, oldValue); if (name === "href" && this._attached && isExternalResourceLink(this)) { obtainTheResource(this); } } get _accept() { return "text/css,*/*;q=0.1"; } get href() { return reflectURLAttribute(this, "href"); } set href(value) { this.setAttribute("href", value); }
}
idlUtils.mixin(HTMLLinkElementImpl.prototype, LinkStyleImpl.prototype);
module.exports = {
implementation: HTMLLinkElementImpl
};
function obtainTheResource(el) {
const href = el.getAttribute("href"); if (href === null || href === "") { return; } const url = parseURLToResultingURLRecord(href, el._ownerDocument); if (url === "failure") { return; } const serialized = whatwgURL.serializeURL(url); fetchStylesheet(el, serialized, el.sheet);
}
function isExternalResourceLink(el) {
// for our purposes, only stylesheets can be external resource links const wrapper = idlUtils.wrapperForImpl(el); if (!/(?:[ \t\n\r\f]|^)stylesheet(?:[ \t\n\r\f]|$)/i.test(wrapper.rel)) { // rel is a space-separated list of tokens, and the original rel types // are case-insensitive. return false; } return Boolean(el.href);
}