happy-dom
Version:
Happy DOM is a JavaScript implementation of a web browser without its graphical user interface. It includes many web standards from WHATWG DOM and HTML.
575 lines • 27.8 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const CSSStyleDeclarationValueParser_js_1 = __importDefault(require("./CSSStyleDeclarationValueParser.cjs"));
/**
* Computed style property parser.
*/
class CSSStyleDeclarationPropertyGetParser {
/**
* Returns margin.
*
* @param properties Properties.
* @returns Property value
*/
static getMargin(properties) {
return this.getPaddingLikeProperty(['margin-top', 'margin-right', 'margin-bottom', 'margin-left'], properties);
}
/**
* Returns padding.
*
* @param properties Properties.
* @returns Property value
*/
static getPadding(properties) {
return this.getPaddingLikeProperty(['padding-top', 'padding-right', 'padding-bottom', 'padding-left'], properties);
}
/**
* Returns outline.
*
* @param properties Properties.
* @returns Property value
*/
static getOutline(properties) {
if (!properties['outline-color']?.value ||
!properties['outline-style']?.value ||
!properties['outline-width']?.value) {
return null;
}
const important = properties['outline-color'].important &&
properties['outline-style'].important &&
properties['outline-width'].important;
if (CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['outline-width'].value) &&
properties['outline-width'].value === properties['outline-style'].value &&
properties['outline-width'].value === properties['outline-color'].value) {
return {
important,
value: properties['outline-width'].value
};
}
const values = [];
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['outline-color']?.value)) {
values.push(properties['outline-color'].value);
}
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['outline-style']?.value)) {
values.push(properties['outline-style'].value);
}
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['outline-width'].value)) {
values.push(properties['outline-width'].value);
}
return {
important,
value: values.join(' ')
};
}
/**
* Returns border.
*
* @param properties Properties.
* @returns Property value
*/
static getBorder(properties) {
if (!properties['border-top-width']?.value ||
properties['border-top-width']?.value !== properties['border-right-width']?.value ||
properties['border-top-width']?.value !== properties['border-bottom-width']?.value ||
properties['border-top-width']?.value !== properties['border-left-width']?.value ||
!properties['border-top-style']?.value ||
properties['border-top-style']?.value !== properties['border-right-style']?.value ||
properties['border-top-style']?.value !== properties['border-bottom-style']?.value ||
properties['border-top-style']?.value !== properties['border-left-style']?.value ||
!properties['border-top-color']?.value ||
properties['border-top-color']?.value !== properties['border-right-color']?.value ||
properties['border-top-color']?.value !== properties['border-bottom-color']?.value ||
properties['border-top-color']?.value !== properties['border-left-color']?.value ||
!properties['border-image-source']?.value ||
!properties['border-image-slice']?.value ||
!properties['border-image-width']?.value ||
!properties['border-image-outset']?.value ||
!properties['border-image-repeat']?.value) {
return null;
}
const important = properties['border-top-width'].important &&
properties['border-right-width'].important &&
properties['border-bottom-width'].important &&
properties['border-left-width'].important &&
properties['border-top-style'].important &&
properties['border-right-style'].important &&
properties['border-bottom-style'].important &&
properties['border-left-style'].important &&
properties['border-top-color'].important &&
properties['border-right-color'].important &&
properties['border-bottom-color'].important &&
properties['border-left-color'].important &&
properties['border-image-source'].important &&
properties['border-image-slice'].important &&
properties['border-image-width'].important &&
properties['border-image-outset'].important &&
properties['border-image-repeat'].important;
if (CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['border-top-width'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['border-top-style'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['border-top-color'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['border-image-source'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['border-image-slice'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['border-image-width'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['border-image-outset'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['border-image-repeat'].value)) {
if (properties['border-top-width'].value !== properties['border-top-style'].value ||
properties['border-top-width'].value !== properties['border-top-color'].value ||
properties['border-top-width'].value !== properties['border-image-source'].value ||
properties['border-top-width'].value !== properties['border-image-slice'].value ||
properties['border-top-width'].value !== properties['border-image-width'].value ||
properties['border-top-width'].value !== properties['border-image-outset'].value ||
properties['border-top-width'].value !== properties['border-image-repeat'].value) {
return null;
}
return {
important,
value: properties['border-top-width'].value
};
}
const values = [];
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['border-top-width'].value)) {
values.push(properties['border-top-width'].value);
}
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['border-top-style'].value)) {
values.push(properties['border-top-style'].value);
}
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['border-top-color'].value)) {
values.push(properties['border-top-color'].value);
}
return {
important,
value: values.join(' ')
};
}
/**
* Returns border.
*
* @param properties Properties.
* @returns Property value
*/
static getBorderTop(properties) {
return this.getBorderTopRightBottomLeft('top', properties);
}
/**
* Returns border.
*
* @param properties Properties.
* @returns Property value
*/
static getBorderRight(properties) {
return this.getBorderTopRightBottomLeft('right', properties);
}
/**
* Returns border.
*
* @param properties Properties.
* @returns Property value
*/
static getBorderBottom(properties) {
return this.getBorderTopRightBottomLeft('bottom', properties);
}
/**
* Returns border.
*
* @param properties Properties.
* @returns Property value
*/
static getBorderLeft(properties) {
return this.getBorderTopRightBottomLeft('left', properties);
}
/**
* Returns border.
*
* @param properties Properties.
* @returns Property value
*/
static getBorderColor(properties) {
return this.getPaddingLikeProperty(['border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color'], properties);
}
/**
* Returns border.
*
* @param properties Properties.
* @returns Property value
*/
static getBorderWidth(properties) {
return this.getPaddingLikeProperty(['border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width'], properties);
}
/**
* Returns border.
*
* @param properties Properties.
* @returns Property value
*/
static getBorderStyle(properties) {
return this.getPaddingLikeProperty(['border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style'], properties);
}
/**
* Returns border radius.
*
* @param properties Properties.
* @returns Property value
*/
static getBorderRadius(properties) {
return this.getPaddingLikeProperty([
'border-top-left-radius',
'border-top-right-radius',
'border-bottom-right-radius',
'border-bottom-left-radius'
], properties);
}
/**
* Returns border image.
*
* @param properties Properties.
* @returns Property value
*/
static getBorderImage(properties) {
if (!properties['border-image-source']?.value ||
!properties['border-image-slice']?.value ||
!properties['border-image-width']?.value ||
!properties['border-image-outset']?.value ||
!properties['border-image-repeat']?.value) {
return null;
}
const important = properties['border-image-source'].important &&
properties['border-image-slice'].important &&
properties['border-image-width'].important &&
properties['border-image-outset'].important &&
properties['border-image-repeat'].important;
if (CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['border-image-source'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['border-image-slice'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['border-image-width'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['border-image-outset'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['border-image-repeat'].value)) {
if (properties['border-image-source'].value !== properties['border-image-slice'].value ||
properties['border-image-source'].value !== properties['border-image-width'].value ||
properties['border-image-source'].value !== properties['border-image-outset'].value ||
properties['border-image-source'].value !== properties['border-image-repeat'].value) {
return null;
}
return {
important,
value: properties['border-image-source'].value
};
}
return {
important,
value: `${properties['border-image-source'].value} ${properties['border-image-slice'].value} / ${properties['border-image-width'].value} / ${properties['border-image-outset'].value} ${properties['border-image-repeat'].value}`
};
}
/**
* Returns background.
*
* @param properties Properties.
* @returns Property value
*/
static getBackground(properties) {
if (!properties['background-image']?.value ||
!properties['background-repeat']?.value ||
!properties['background-attachment']?.value ||
!properties['background-position-x']?.value ||
!properties['background-position-y']?.value ||
!properties['background-color']?.value ||
!properties['background-size']?.value ||
!properties['background-origin']?.value ||
!properties['background-clip']?.value) {
return null;
}
const important = properties['background-image'].important &&
properties['background-repeat'].important &&
properties['background-attachment'].important &&
properties['background-position-x'].important &&
properties['background-position-y'].important &&
properties['background-color'].important &&
properties['background-size'].important &&
properties['background-origin'].important &&
properties['background-clip'].important;
if (CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['background-image'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['background-repeat'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['background-attachment'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['background-position-x'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['background-position-y'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['background-color'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['background-size'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['background-origin'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties['background-clip'].value)) {
if (properties['background-image'].value !== properties['background-repeat'].value ||
properties['background-image'].value !== properties['background-attachment'].value ||
properties['background-image'].value !== properties['background-position-x'].value ||
properties['background-image'].value !== properties['background-position-y'].value ||
properties['background-image'].value !== properties['background-color'].value ||
properties['background-image'].value !== properties['background-size'].value ||
properties['background-image'].value !== properties['background-origin'].value ||
properties['background-image'].value !== properties['background-clip'].value) {
return null;
}
return {
important,
value: properties['background-image'].value
};
}
const values = [];
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['background-image'].value)) {
values.push(properties['background-image'].value);
}
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['background-position-x'].value) &&
!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['background-position-y'].value) &&
!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['background-size'].value)) {
values.push(`${properties['background-position-x'].value} ${properties['background-position-y'].value} / ${properties['background-size'].value}`);
}
else if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['background-position-x'].value) &&
!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['background-position-y'].value)) {
values.push(`${properties['background-position-x'].value} ${properties['background-position-y'].value}`);
}
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['background-repeat'].value)) {
values.push(properties['background-repeat'].value);
}
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['background-attachment'].value)) {
values.push(properties['background-attachment'].value);
}
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['background-origin'].value)) {
values.push(properties['background-origin'].value);
}
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['background-clip'].value)) {
values.push(properties['background-clip'].value);
}
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties['background-color'].value)) {
values.push(properties['background-color'].value);
}
return {
important,
value: values.join(' ')
};
}
/**
* Returns background position.
*
* @param properties Properties.
* @returns Property value
*/
static getBackgroundPosition(properties) {
if (!properties['background-position-x']?.value ||
!properties['background-position-y']?.value) {
return null;
}
const important = properties['background-position-x'].important &&
properties['background-position-y'].important;
if (CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['background-position-x'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['background-position-y'].value)) {
if (properties['background-position-x'].value !== properties['background-position-y'].value) {
return null;
}
return {
important,
value: properties['background-position-x'].value
};
}
const positionX = properties['background-position-x'].value.replace(/ *, */g, ',').split(',');
const positionY = properties['background-position-y'].value.replace(/ *, */g, ',').split(',');
const parts = [];
for (let i = 0; i < positionX.length; i++) {
parts.push(`${positionX[i]} ${positionY[i]}`);
}
return {
important,
value: parts.join(', ')
};
}
/**
* Returns flex.
*
* @param properties Properties.
* @returns Property value
*/
static getFlex(properties) {
if (!properties['flex-grow']?.value ||
!properties['flex-shrink']?.value ||
!properties['flex-basis']?.value) {
return null;
}
const important = properties['flex-grow'].important &&
properties['flex-shrink'].important &&
properties['flex-basis'].important;
if (CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['flex-grow'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['flex-shrink'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['flex-basis'].value)) {
if (properties['flex-grow'].value !== properties['flex-shrink'].value ||
properties['flex-grow'].value !== properties['flex-basis'].value) {
return null;
}
return {
important,
value: properties['flex-grow'].value
};
}
return {
important,
value: `${properties['flex-grow'].value} ${properties['flex-shrink'].value} ${properties['flex-basis'].value}`
};
}
/**
* Returns flex.
*
* @param properties Properties.
* @returns Property value
*/
static getFont(properties) {
if (!properties['font-size']?.value ||
!properties['font-family']?.value ||
!properties['font-weight']?.value ||
!properties['font-style']?.value ||
!properties['font-variant']?.value ||
!properties['font-stretch']?.value ||
!properties['line-height']?.value) {
return null;
}
const important = properties['font-size'].important &&
properties['font-family'].important &&
properties['font-weight'].important &&
properties['font-style'].important &&
properties['font-variant'].important &&
properties['font-stretch'].important &&
properties['line-height'].important;
if (CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['font-size'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['font-family'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['font-weight'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['font-style'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['font-variant'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['font-stretch'].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties['line-height'].value)) {
if (properties['font-size'].value !== properties['font-family'].value ||
properties['font-size'].value !== properties['font-weight'].value ||
properties['font-size'].value !== properties['font-style'].value ||
properties['font-size'].value !== properties['font-variant'].value ||
properties['font-size'].value !== properties['font-stretch'].value ||
properties['font-size'].value !== properties['line-height'].value) {
return null;
}
return {
important,
value: properties['font-size'].value
};
}
const values = [];
if (properties['font-style'].value !== 'normal') {
values.push(properties['font-style'].value);
}
if (properties['font-variant'].value !== 'normal') {
values.push(properties['font-variant'].value);
}
if (properties['font-weight'].value !== 'normal') {
values.push(properties['font-weight'].value);
}
if (properties['font-stretch'].value !== 'normal') {
values.push(properties['font-stretch'].value);
}
if (properties['line-height'].value !== 'normal') {
values.push(`${properties['font-size'].value} / ${properties['line-height'].value}`);
}
else {
values.push(properties['font-size'].value);
}
values.push(properties['font-family'].value);
return {
important,
value: values.join(' ')
};
}
/**
* Returns border.
*
* @param properties Properties.
* @param position
* @returns Property value
*/
static getBorderTopRightBottomLeft(position, properties) {
if (!properties[`border-${position}-width`]?.value ||
!properties[`border-${position}-style`]?.value ||
!properties[`border-${position}-color`]?.value) {
return null;
}
const important = properties[`border-${position}-width`].important &&
properties[`border-${position}-style`].important &&
properties[`border-${position}-color`].important;
if (CSSStyleDeclarationValueParser_js_1.default.getGlobalExceptInitial(properties[`border-${position}-width`].value) &&
properties[`border-${position}-width`].value ===
properties[`border-${position}-style`].value &&
properties[`border-${position}-width`].value === properties[`border-${position}-color`].value) {
return {
important,
value: properties[`border-${position}-width`].value
};
}
const values = [];
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties[`border-${position}-width`].value)) {
values.push(properties[`border-${position}-width`].value);
}
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties[`border-${position}-style`]?.value)) {
values.push(properties[`border-${position}-style`].value);
}
if (!CSSStyleDeclarationValueParser_js_1.default.getInitial(properties[`border-${position}-color`]?.value)) {
values.push(properties[`border-${position}-color`].value);
}
return {
important,
value: values.join(' ')
};
}
/**
* Returns a padding like property.
*
* @param properties Properties.
* @param position
* @param propertyNames
* @returns Property value
*/
static getPaddingLikeProperty(propertyNames, properties) {
if (!properties[propertyNames[0]]?.value ||
!properties[propertyNames[1]]?.value ||
!properties[propertyNames[2]]?.value ||
!properties[propertyNames[3]]?.value) {
return null;
}
const important = properties[propertyNames[0]].important &&
properties[propertyNames[1]].important &&
properties[propertyNames[2]].important &&
properties[propertyNames[3]].important;
if (CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties[propertyNames[0]].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties[propertyNames[1]].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties[propertyNames[2]].value) ||
CSSStyleDeclarationValueParser_js_1.default.getGlobal(properties[propertyNames[3]].value)) {
if (properties[propertyNames[0]].value !== properties[propertyNames[1]].value ||
properties[propertyNames[0]].value !== properties[propertyNames[2]].value ||
properties[propertyNames[0]].value !== properties[propertyNames[3]].value) {
return null;
}
return {
important,
value: properties[propertyNames[0]].value
};
}
const values = [properties[propertyNames[0]].value];
if (properties[propertyNames[1]].value !== properties[propertyNames[0]].value ||
properties[propertyNames[2]].value !== properties[propertyNames[0]].value ||
properties[propertyNames[3]].value !== properties[propertyNames[1]].value) {
values.push(properties[propertyNames[1]].value);
}
if (properties[propertyNames[2]].value !== properties[propertyNames[0]].value ||
properties[propertyNames[3]].value !== properties[propertyNames[1]].value) {
values.push(properties[propertyNames[2]].value);
}
if (properties[propertyNames[3]].value !== properties[propertyNames[1]].value) {
values.push(properties[propertyNames[3]].value);
}
return {
important,
value: values.join(' ')
};
}
}
exports.default = CSSStyleDeclarationPropertyGetParser;
//# sourceMappingURL=CSSStyleDeclarationPropertyGetParser.cjs.map
;