happy-dom 7.3.0 → 7.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of happy-dom might be problematic. Click here for more details.
- package/lib/css/declaration/AbstractCSSStyleDeclaration.js +9 -0
- package/lib/css/declaration/AbstractCSSStyleDeclaration.js.map +1 -1
- package/lib/css/declaration/utilities/CSSStyleDeclarationElementStyle.d.ts +0 -2
- package/lib/css/declaration/utilities/CSSStyleDeclarationElementStyle.js +54 -25
- package/lib/css/declaration/utilities/CSSStyleDeclarationElementStyle.js.map +1 -1
- package/lib/event/EventTarget.d.ts +14 -1
- package/lib/event/EventTarget.js +16 -1
- package/lib/event/EventTarget.js.map +1 -1
- package/lib/event/IEventTarget.d.ts +20 -0
- package/lib/event/NonImplementedEventTypes.js +2 -1
- package/lib/event/NonImplementedEventTypes.js.map +1 -1
- package/lib/fetch/IRequestInit.d.ts +1 -0
- package/lib/form-data/IFormData.d.ts +2 -0
- package/lib/nodes/character-data/CharacterData.js +3 -0
- package/lib/nodes/character-data/CharacterData.js.map +1 -1
- package/lib/nodes/document/Document.d.ts +110 -1
- package/lib/nodes/document/Document.js +112 -1
- package/lib/nodes/document/Document.js.map +1 -1
- package/lib/nodes/document/IDocument.d.ts +109 -1
- package/lib/nodes/element/Element.d.ts +35 -0
- package/lib/nodes/element/Element.js +42 -7
- package/lib/nodes/element/Element.js.map +1 -1
- package/lib/nodes/element/IElement.d.ts +35 -0
- package/lib/nodes/html-dialog-element/HTMLDialogElement.d.ts +3 -0
- package/lib/nodes/html-dialog-element/HTMLDialogElement.js +3 -0
- package/lib/nodes/html-dialog-element/HTMLDialogElement.js.map +1 -1
- package/lib/nodes/html-dialog-element/IHTMLDialogElement.d.ts +3 -0
- package/lib/nodes/html-element/HTMLElement.d.ts +26 -0
- package/lib/nodes/html-element/HTMLElement.js +26 -0
- package/lib/nodes/html-element/HTMLElement.js.map +1 -1
- package/lib/nodes/html-element/IHTMLElement.d.ts +26 -0
- package/lib/nodes/html-form-element/HTMLFormElement.d.ts +4 -0
- package/lib/nodes/html-form-element/HTMLFormElement.js +7 -0
- package/lib/nodes/html-form-element/HTMLFormElement.js.map +1 -1
- package/lib/nodes/html-form-element/IHTMLFormElement.d.ts +4 -0
- package/lib/nodes/html-input-element/HTMLInputElement.d.ts +4 -0
- package/lib/nodes/html-input-element/HTMLInputElement.js +4 -0
- package/lib/nodes/html-input-element/HTMLInputElement.js.map +1 -1
- package/lib/nodes/html-input-element/IHTMLInputElement.d.ts +4 -0
- package/lib/nodes/html-media-element/HTMLMediaElement.d.ts +23 -8
- package/lib/nodes/html-media-element/HTMLMediaElement.js +15 -0
- package/lib/nodes/html-media-element/HTMLMediaElement.js.map +1 -1
- package/lib/nodes/html-media-element/IHTMLMediaElement.d.ts +24 -0
- package/lib/nodes/html-select-element/HTMLSelectElement.d.ts +3 -0
- package/lib/nodes/html-select-element/HTMLSelectElement.js +3 -0
- package/lib/nodes/html-select-element/HTMLSelectElement.js.map +1 -1
- package/lib/nodes/html-select-element/IHTMLSelectElement.d.ts +3 -0
- package/lib/nodes/html-slot-element/HTMLSlotElement.d.ts +2 -0
- package/lib/nodes/html-slot-element/HTMLSlotElement.js +5 -0
- package/lib/nodes/html-slot-element/HTMLSlotElement.js.map +1 -1
- package/lib/nodes/html-slot-element/IHTMLSlotElement.d.ts +2 -0
- package/lib/nodes/html-text-area-element/HTMLTextAreaElement.d.ts +4 -1
- package/lib/nodes/html-text-area-element/HTMLTextAreaElement.js +4 -1
- package/lib/nodes/html-text-area-element/HTMLTextAreaElement.js.map +1 -1
- package/lib/nodes/html-text-area-element/IHTMLTextAreaElement.d.ts +3 -0
- package/lib/nodes/node/Node.js +9 -0
- package/lib/nodes/node/Node.js.map +1 -1
- package/lib/nodes/shadow-root/IShadowRoot.d.ts +2 -0
- package/lib/nodes/shadow-root/ShadowRoot.d.ts +2 -0
- package/lib/nodes/shadow-root/ShadowRoot.js +2 -0
- package/lib/nodes/shadow-root/ShadowRoot.js.map +1 -1
- package/lib/nodes/svg-element/ISVGElement.d.ts +7 -0
- package/lib/nodes/svg-element/ISVGSVGElement.d.ts +19 -0
- package/lib/nodes/svg-element/SVGElement.d.ts +7 -0
- package/lib/nodes/svg-element/SVGElement.js +7 -0
- package/lib/nodes/svg-element/SVGElement.js.map +1 -1
- package/lib/nodes/svg-element/SVGSVGElement.d.ts +19 -0
- package/lib/nodes/svg-element/SVGSVGElement.js +22 -0
- package/lib/nodes/svg-element/SVGSVGElement.js.map +1 -1
- package/lib/query-selector/QuerySelector.d.ts +21 -0
- package/lib/query-selector/QuerySelector.js +45 -4
- package/lib/query-selector/QuerySelector.js.map +1 -1
- package/lib/query-selector/SelectorItem.d.ts +14 -11
- package/lib/query-selector/SelectorItem.js +35 -19
- package/lib/query-selector/SelectorItem.js.map +1 -1
- package/lib/window/GlobalWindow.d.ts +2 -0
- package/lib/window/IWindow.d.ts +4 -0
- package/lib/window/Window.d.ts +3 -0
- package/package.json +2 -2
- package/src/css/declaration/AbstractCSSStyleDeclaration.ts +12 -0
- package/src/css/declaration/utilities/CSSStyleDeclarationElementStyle.ts +86 -36
- package/src/event/EventTarget.ts +17 -1
- package/src/event/IEventTarget.ts +22 -0
- package/src/event/NonImplementedEventTypes.ts +2 -1
- package/src/nodes/character-data/CharacterData.ts +4 -0
- package/src/nodes/document/Document.ts +115 -1
- package/src/nodes/document/IDocument.ts +111 -1
- package/src/nodes/element/Element.ts +46 -7
- package/src/nodes/element/IElement.ts +37 -0
- package/src/nodes/html-dialog-element/HTMLDialogElement.ts +4 -0
- package/src/nodes/html-dialog-element/IHTMLDialogElement.ts +5 -0
- package/src/nodes/html-element/HTMLElement.ts +28 -0
- package/src/nodes/html-element/IHTMLElement.ts +28 -0
- package/src/nodes/html-form-element/HTMLFormElement.ts +6 -0
- package/src/nodes/html-form-element/IHTMLFormElement.ts +6 -0
- package/src/nodes/html-input-element/HTMLInputElement.ts +5 -0
- package/src/nodes/html-input-element/IHTMLInputElement.ts +6 -0
- package/src/nodes/html-media-element/HTMLMediaElement.ts +23 -8
- package/src/nodes/html-media-element/IHTMLMediaElement.ts +26 -0
- package/src/nodes/html-select-element/HTMLSelectElement.ts +5 -0
- package/src/nodes/html-select-element/IHTMLSelectElement.ts +5 -0
- package/src/nodes/html-slot-element/HTMLSlotElement.ts +4 -0
- package/src/nodes/html-slot-element/IHTMLSlotElement.ts +4 -0
- package/src/nodes/html-text-area-element/HTMLTextAreaElement.ts +6 -1
- package/src/nodes/html-text-area-element/IHTMLTextAreaElement.ts +5 -0
- package/src/nodes/node/Node.ts +12 -0
- package/src/nodes/shadow-root/IShadowRoot.ts +4 -0
- package/src/nodes/shadow-root/ShadowRoot.ts +4 -0
- package/src/nodes/svg-element/ISVGElement.ts +9 -0
- package/src/nodes/svg-element/ISVGSVGElement.ts +21 -0
- package/src/nodes/svg-element/SVGElement.ts +9 -0
- package/src/nodes/svg-element/SVGSVGElement.ts +21 -0
- package/src/query-selector/QuerySelector.ts +66 -5
- package/src/query-selector/SelectorItem.ts +66 -37
@@ -44,39 +44,50 @@ class SelectorItem {
|
|
44
44
|
* Matches a selector against an element.
|
45
45
|
*
|
46
46
|
* @param element HTML element.
|
47
|
-
* @returns
|
47
|
+
* @returns Result.
|
48
48
|
*/
|
49
49
|
match(element) {
|
50
50
|
const selector = this.selector;
|
51
|
+
let priorityWeight = 0;
|
51
52
|
// Is all (*)
|
52
53
|
if (this.isAll) {
|
53
|
-
return true;
|
54
|
+
return { priorityWeight: 0, matches: true };
|
54
55
|
}
|
55
56
|
// ID Match
|
56
57
|
if (this.isID) {
|
58
|
+
priorityWeight += 100;
|
57
59
|
if (this.id !== element.id) {
|
58
|
-
return false;
|
60
|
+
return { priorityWeight: 0, matches: false };
|
59
61
|
}
|
60
62
|
}
|
61
63
|
// Tag name match
|
62
64
|
if (this.isTagName) {
|
65
|
+
priorityWeight += 1;
|
63
66
|
if (this.tagName !== element.tagName) {
|
64
|
-
return false;
|
67
|
+
return { priorityWeight: 0, matches: false };
|
65
68
|
}
|
66
69
|
}
|
67
70
|
// Class match
|
68
|
-
if (this.isClass
|
69
|
-
|
71
|
+
if (this.isClass) {
|
72
|
+
const result = this.matchesClass(element, selector);
|
73
|
+
priorityWeight += result.priorityWeight;
|
74
|
+
if (!result.matches) {
|
75
|
+
return { priorityWeight: 0, matches: false };
|
76
|
+
}
|
70
77
|
}
|
71
78
|
// Pseudo match
|
72
79
|
if (this.isPseudo && !this.matchesPsuedo(element, selector)) {
|
73
|
-
return false;
|
80
|
+
return { priorityWeight: 0, matches: false };
|
74
81
|
}
|
75
82
|
// Attribute match
|
76
|
-
if (this.isAttribute
|
77
|
-
|
83
|
+
if (this.isAttribute) {
|
84
|
+
const result = this.matchesAttribute(element, selector);
|
85
|
+
priorityWeight += result.priorityWeight;
|
86
|
+
if (!result.matches) {
|
87
|
+
return { priorityWeight: 0, matches: false };
|
88
|
+
}
|
78
89
|
}
|
79
|
-
return true;
|
90
|
+
return { priorityWeight, matches: true };
|
80
91
|
}
|
81
92
|
/**
|
82
93
|
* Matches a psuedo selector.
|
@@ -94,8 +105,8 @@ class SelectorItem {
|
|
94
105
|
return false;
|
95
106
|
}
|
96
107
|
else if (match[3] &&
|
97
|
-
((isNotClass && this.matchesClass(element, match[3])) ||
|
98
|
-
(!isNotClass && this.matchesAttribute(element, match[3])))) {
|
108
|
+
((isNotClass && this.matchesClass(element, match[3]).matches) ||
|
109
|
+
(!isNotClass && this.matchesAttribute(element, match[3])).matches)) {
|
99
110
|
return false;
|
100
111
|
}
|
101
112
|
else if (match[4] && !this.matchesPsuedoExpression(element, match[4])) {
|
@@ -209,38 +220,43 @@ class SelectorItem {
|
|
209
220
|
*
|
210
221
|
* @param element Element.
|
211
222
|
* @param selector Selector.
|
212
|
-
* @returns
|
223
|
+
* @returns Result.
|
213
224
|
*/
|
214
225
|
matchesAttribute(element, selector) {
|
215
226
|
const regexp = new RegExp(ATTRIBUTE_REGEXP, 'g');
|
216
227
|
let match;
|
228
|
+
let priorityWeight = 0;
|
217
229
|
while ((match = regexp.exec(selector))) {
|
218
230
|
const isPsuedo = match.index > 0 && selector[match.index - 1] === '(';
|
231
|
+
priorityWeight += 10;
|
219
232
|
if (!isPsuedo &&
|
220
233
|
((match[1] && !this.matchesAttributeName(element, match[1])) ||
|
221
234
|
(match[2] && !this.matchesAttributeNameAndValue(element, match[2], match[4], match[3])))) {
|
222
|
-
return false;
|
235
|
+
return { priorityWeight: 0, matches: false };
|
223
236
|
}
|
224
237
|
}
|
225
|
-
return true;
|
238
|
+
return { priorityWeight, matches: true };
|
226
239
|
}
|
227
240
|
/**
|
228
241
|
* Matches class.
|
229
242
|
*
|
230
243
|
* @param element Element.
|
231
244
|
* @param selector Selector.
|
232
|
-
* @returns
|
245
|
+
* @returns Result.
|
233
246
|
*/
|
234
247
|
matchesClass(element, selector) {
|
235
248
|
const regexp = new RegExp(CLASS_REGEXP, 'g');
|
236
249
|
const classList = element.className.split(' ');
|
250
|
+
const classSelector = selector.split(':')[0];
|
251
|
+
let priorityWeight = 0;
|
237
252
|
let match;
|
238
|
-
while ((match = regexp.exec(
|
253
|
+
while ((match = regexp.exec(classSelector))) {
|
254
|
+
priorityWeight += 10;
|
239
255
|
if (!classList.includes(match[1])) {
|
240
|
-
return false;
|
256
|
+
return { priorityWeight: 0, matches: false };
|
241
257
|
}
|
242
258
|
}
|
243
|
-
return true;
|
259
|
+
return { priorityWeight, matches: true };
|
244
260
|
}
|
245
261
|
/**
|
246
262
|
* Matches attribute name only.
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SelectorItem.js","sourceRoot":"","sources":["../../src/query-selector/SelectorItem.ts"],"names":[],"mappings":";;;;;AAAA,6EAAqD;
|
1
|
+
{"version":3,"file":"SelectorItem.js","sourceRoot":"","sources":["../../src/query-selector/SelectorItem.ts"],"names":[],"mappings":"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"}
|
package/lib/window/IWindow.d.ts
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
/// <reference types="node" />
|
2
|
+
/// <reference types="node" />
|
3
|
+
/// <reference types="node" />
|
4
|
+
/// <reference types="node" />
|
5
|
+
/// <reference types="node" />
|
2
6
|
import CustomElementRegistry from '../custom-element/CustomElementRegistry';
|
3
7
|
import Document from '../nodes/document/Document';
|
4
8
|
import HTMLDocument from '../nodes/html-document/HTMLDocument';
|
package/lib/window/Window.d.ts
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
/// <reference types="node" />
|
2
|
+
/// <reference types="node" />
|
3
|
+
/// <reference types="node" />
|
4
|
+
/// <reference types="node" />
|
2
5
|
import CustomElementRegistry from '../custom-element/CustomElementRegistry';
|
3
6
|
import Document from '../nodes/document/Document';
|
4
7
|
import HTMLDocument from '../nodes/html-document/HTMLDocument';
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "happy-dom",
|
3
|
-
"version": "7.
|
3
|
+
"version": "7.5.0",
|
4
4
|
"license": "MIT",
|
5
5
|
"homepage": "https://github.com/capricorn86/happy-dom",
|
6
6
|
"repository": "https://github.com/capricorn86/happy-dom",
|
@@ -75,5 +75,5 @@
|
|
75
75
|
"ts-jest": "^27.1.3",
|
76
76
|
"typescript": "^4.6.2"
|
77
77
|
},
|
78
|
-
"gitHead": "
|
78
|
+
"gitHead": "74c34698afe9331bce2e3266aaac1bc6eec35bcf"
|
79
79
|
}
|
@@ -86,6 +86,10 @@ export default abstract class AbstractCSSStyleDeclaration {
|
|
86
86
|
this._ownerElement['_attributes']['style'].name = 'style';
|
87
87
|
}
|
88
88
|
|
89
|
+
if (this._ownerElement.isConnected) {
|
90
|
+
this._ownerElement.ownerDocument['_cacheID']++;
|
91
|
+
}
|
92
|
+
|
89
93
|
this._ownerElement['_attributes']['style'].value = style.toString();
|
90
94
|
}
|
91
95
|
} else {
|
@@ -137,6 +141,10 @@ export default abstract class AbstractCSSStyleDeclaration {
|
|
137
141
|
const style = this._elementStyle.getElementStyle();
|
138
142
|
style.set(name, value, !!priority);
|
139
143
|
|
144
|
+
if (this._ownerElement.isConnected) {
|
145
|
+
this._ownerElement.ownerDocument['_cacheID']++;
|
146
|
+
}
|
147
|
+
|
140
148
|
this._ownerElement['_attributes']['style'].value = style.toString();
|
141
149
|
} else {
|
142
150
|
this._style.set(name, value, !!priority);
|
@@ -163,6 +171,10 @@ export default abstract class AbstractCSSStyleDeclaration {
|
|
163
171
|
style.remove(name);
|
164
172
|
const newCSSText = style.toString();
|
165
173
|
if (newCSSText) {
|
174
|
+
if (this._ownerElement.isConnected) {
|
175
|
+
this._ownerElement.ownerDocument['_cacheID']++;
|
176
|
+
}
|
177
|
+
|
166
178
|
this._ownerElement['_attributes']['style'].value = newCSSText;
|
167
179
|
} else {
|
168
180
|
delete this._ownerElement['_attributes']['style'];
|
@@ -12,14 +12,29 @@ import CSSStyleRule from '../../rules/CSSStyleRule';
|
|
12
12
|
import CSSStyleDeclarationElementDefaultCSS from './CSSStyleDeclarationElementDefaultCSS';
|
13
13
|
import CSSStyleDeclarationElementInheritedProperties from './CSSStyleDeclarationElementInheritedProperties';
|
14
14
|
import CSSStyleDeclarationCSSParser from './CSSStyleDeclarationCSSParser';
|
15
|
+
import QuerySelector from '../../../query-selector/QuerySelector';
|
15
16
|
|
16
17
|
const CSS_VARIABLE_REGEXP = /var\( *(--[^) ]+)\)/g;
|
17
18
|
|
19
|
+
type IStyleAndElement = {
|
20
|
+
element: IElement | IShadowRoot | IDocument;
|
21
|
+
cssTexts: Array<{ cssText: string; priorityWeight: number }>;
|
22
|
+
};
|
23
|
+
|
18
24
|
/**
|
19
25
|
* CSS Style Declaration utility
|
20
26
|
*/
|
21
27
|
export default class CSSStyleDeclarationElementStyle {
|
22
|
-
private cache: {
|
28
|
+
private cache: {
|
29
|
+
propertyManager: CSSStyleDeclarationPropertyManager;
|
30
|
+
cssText: string;
|
31
|
+
documentCacheID: number;
|
32
|
+
} = {
|
33
|
+
propertyManager: null,
|
34
|
+
cssText: null,
|
35
|
+
documentCacheID: null
|
36
|
+
};
|
37
|
+
|
23
38
|
private element: IElement;
|
24
39
|
private computed: boolean;
|
25
40
|
|
@@ -47,11 +62,12 @@ export default class CSSStyleDeclarationElementStyle {
|
|
47
62
|
const cssText = this.element['_attributes']['style']?.value;
|
48
63
|
|
49
64
|
if (cssText) {
|
50
|
-
if (this.cache
|
51
|
-
return this.cache
|
65
|
+
if (this.cache.propertyManager && this.cache.cssText === cssText) {
|
66
|
+
return this.cache.propertyManager;
|
52
67
|
}
|
53
|
-
this.cache
|
54
|
-
|
68
|
+
this.cache.cssText = cssText;
|
69
|
+
this.cache.propertyManager = new CSSStyleDeclarationPropertyManager({ cssText });
|
70
|
+
return this.cache.propertyManager;
|
55
71
|
}
|
56
72
|
|
57
73
|
return new CSSStyleDeclarationPropertyManager();
|
@@ -64,28 +80,37 @@ export default class CSSStyleDeclarationElementStyle {
|
|
64
80
|
* @returns Style sheets.
|
65
81
|
*/
|
66
82
|
private getComputedElementStyle(): CSSStyleDeclarationPropertyManager {
|
67
|
-
const documentElements: Array<
|
68
|
-
const parentElements: Array<
|
69
|
-
let styleAndElement = {
|
83
|
+
const documentElements: Array<IStyleAndElement> = [];
|
84
|
+
const parentElements: Array<IStyleAndElement> = [];
|
85
|
+
let styleAndElement: IStyleAndElement = {
|
70
86
|
element: <IElement | IShadowRoot | IDocument>this.element,
|
71
|
-
|
87
|
+
cssTexts: []
|
72
88
|
};
|
73
|
-
let shadowRootElements: Array<
|
89
|
+
let shadowRootElements: Array<IStyleAndElement> = [];
|
74
90
|
|
75
91
|
if (!this.element.isConnected) {
|
76
92
|
return new CSSStyleDeclarationPropertyManager();
|
77
93
|
}
|
78
94
|
|
95
|
+
if (
|
96
|
+
this.cache.propertyManager &&
|
97
|
+
this.cache.documentCacheID === this.element.ownerDocument['_cacheID']
|
98
|
+
) {
|
99
|
+
return this.cache.propertyManager;
|
100
|
+
}
|
101
|
+
|
102
|
+
this.cache.documentCacheID = this.element.ownerDocument['_cacheID'];
|
103
|
+
|
79
104
|
// Walks through all parent elements and stores them in an array with element and matching CSS text.
|
80
105
|
while (styleAndElement.element) {
|
81
106
|
if (styleAndElement.element.nodeType === NodeTypeEnum.elementNode) {
|
82
107
|
const rootNode = styleAndElement.element.getRootNode();
|
83
108
|
if (rootNode.nodeType === NodeTypeEnum.documentNode) {
|
84
|
-
documentElements.unshift(
|
109
|
+
documentElements.unshift(styleAndElement);
|
85
110
|
} else {
|
86
|
-
shadowRootElements.unshift(
|
111
|
+
shadowRootElements.unshift(styleAndElement);
|
87
112
|
}
|
88
|
-
parentElements.unshift(
|
113
|
+
parentElements.unshift(styleAndElement);
|
89
114
|
}
|
90
115
|
|
91
116
|
if (styleAndElement.element === this.element.ownerDocument) {
|
@@ -103,7 +128,7 @@ export default class CSSStyleDeclarationElementStyle {
|
|
103
128
|
}
|
104
129
|
}
|
105
130
|
|
106
|
-
styleAndElement = { element: null,
|
131
|
+
styleAndElement = { element: null, cssTexts: [] };
|
107
132
|
} else if ((<IShadowRoot>styleAndElement.element).host) {
|
108
133
|
const styleSheets = <INodeList<IHTMLStyleElement>>(
|
109
134
|
(<IShadowRoot>styleAndElement.element).querySelectorAll('style,link[rel="stylesheet"]')
|
@@ -111,7 +136,7 @@ export default class CSSStyleDeclarationElementStyle {
|
|
111
136
|
|
112
137
|
styleAndElement = {
|
113
138
|
element: <IElement>(<IShadowRoot>styleAndElement.element).host,
|
114
|
-
|
139
|
+
cssTexts: []
|
115
140
|
};
|
116
141
|
|
117
142
|
for (const styleSheet of styleSheets) {
|
@@ -120,39 +145,58 @@ export default class CSSStyleDeclarationElementStyle {
|
|
120
145
|
this.parseCSSRules({
|
121
146
|
elements: shadowRootElements,
|
122
147
|
cssRules: sheet.cssRules,
|
123
|
-
hostElement:
|
148
|
+
hostElement: styleAndElement
|
124
149
|
});
|
125
150
|
}
|
126
151
|
}
|
127
152
|
shadowRootElements = [];
|
128
153
|
} else {
|
129
|
-
styleAndElement = { element: <IElement>styleAndElement.element.parentNode,
|
154
|
+
styleAndElement = { element: <IElement>styleAndElement.element.parentNode, cssTexts: [] };
|
130
155
|
}
|
131
156
|
}
|
132
157
|
|
133
158
|
// Concatenates all parent element CSS to one string.
|
134
159
|
const targetElement = parentElements[parentElements.length - 1];
|
135
|
-
let inheritedCSSText =
|
160
|
+
let inheritedCSSText = '';
|
136
161
|
|
137
162
|
for (const parentElement of parentElements) {
|
138
163
|
if (parentElement !== targetElement) {
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
164
|
+
parentElement.cssTexts.sort((a, b) => a.priorityWeight - b.priorityWeight);
|
165
|
+
|
166
|
+
if (CSSStyleDeclarationElementDefaultCSS[(<IElement>parentElement.element).tagName]) {
|
167
|
+
inheritedCSSText +=
|
168
|
+
CSSStyleDeclarationElementDefaultCSS[(<IElement>parentElement.element).tagName];
|
169
|
+
}
|
170
|
+
|
171
|
+
for (const cssText of parentElement.cssTexts) {
|
172
|
+
inheritedCSSText += cssText.cssText;
|
173
|
+
}
|
174
|
+
|
175
|
+
if (parentElement.element['_attributes']['style']?.value) {
|
176
|
+
inheritedCSSText += parentElement.element['_attributes']['style'].value;
|
177
|
+
}
|
143
178
|
}
|
144
179
|
}
|
145
180
|
|
146
181
|
const cssVariables: { [k: string]: string } = {};
|
147
182
|
const properties = {};
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
183
|
+
let targetCSSText =
|
184
|
+
CSSStyleDeclarationElementDefaultCSS[(<IElement>targetElement.element).tagName] || '';
|
185
|
+
|
186
|
+
targetElement.cssTexts.sort((a, b) => a.priorityWeight - b.priorityWeight);
|
187
|
+
|
188
|
+
for (const cssText of targetElement.cssTexts) {
|
189
|
+
targetCSSText += cssText.cssText;
|
190
|
+
}
|
191
|
+
|
192
|
+
if (targetElement.element['_attributes']['style']?.value) {
|
193
|
+
targetCSSText += targetElement.element['_attributes']['style'].value;
|
194
|
+
}
|
195
|
+
|
152
196
|
const combinedCSSText = inheritedCSSText + targetCSSText;
|
153
197
|
|
154
|
-
if (this.cache
|
155
|
-
return this.cache
|
198
|
+
if (this.cache.propertyManager && this.cache.cssText === combinedCSSText) {
|
199
|
+
return this.cache.propertyManager;
|
156
200
|
}
|
157
201
|
|
158
202
|
// Parses the parent element CSS and stores CSS variables and inherited properties.
|
@@ -204,7 +248,8 @@ export default class CSSStyleDeclarationElementStyle {
|
|
204
248
|
propertyManager.set(name, properties[name].value, properties[name].important);
|
205
249
|
}
|
206
250
|
|
207
|
-
this.cache
|
251
|
+
this.cache.cssText = combinedCSSText;
|
252
|
+
this.cache.propertyManager = propertyManager;
|
208
253
|
|
209
254
|
return propertyManager;
|
210
255
|
}
|
@@ -216,13 +261,11 @@ export default class CSSStyleDeclarationElementStyle {
|
|
216
261
|
* @param options.elements Elements.
|
217
262
|
* @param options.cssRules CSS rules.
|
218
263
|
* @param [options.hostElement] Host element.
|
219
|
-
* @param [options.hostElement.element] Element.
|
220
|
-
* @param [options.hostElement.cssText] CSS text.
|
221
264
|
*/
|
222
265
|
private parseCSSRules(options: {
|
223
266
|
cssRules: CSSRule[];
|
224
|
-
elements: Array<
|
225
|
-
hostElement?:
|
267
|
+
elements: Array<IStyleAndElement>;
|
268
|
+
hostElement?: IStyleAndElement;
|
226
269
|
}): void {
|
227
270
|
if (!options.elements.length) {
|
228
271
|
return;
|
@@ -236,12 +279,19 @@ export default class CSSStyleDeclarationElementStyle {
|
|
236
279
|
if (selectorText) {
|
237
280
|
if (selectorText.startsWith(':host')) {
|
238
281
|
if (options.hostElement) {
|
239
|
-
options.hostElement.
|
282
|
+
options.hostElement.cssTexts.push({
|
283
|
+
cssText: (<CSSStyleRule>rule)._cssText,
|
284
|
+
priorityWeight: 0
|
285
|
+
});
|
240
286
|
}
|
241
287
|
} else {
|
242
288
|
for (const element of options.elements) {
|
243
|
-
|
244
|
-
|
289
|
+
const matchResult = QuerySelector.match(element.element, selectorText);
|
290
|
+
if (matchResult.matches) {
|
291
|
+
element.cssTexts.push({
|
292
|
+
cssText: (<CSSStyleRule>rule)._cssText,
|
293
|
+
priorityWeight: matchResult.priorityWeight
|
294
|
+
});
|
245
295
|
}
|
246
296
|
}
|
247
297
|
}
|
package/src/event/EventTarget.ts
CHANGED
@@ -77,12 +77,28 @@ export default abstract class EventTarget implements IEventTarget {
|
|
77
77
|
/**
|
78
78
|
* Adds an event listener.
|
79
79
|
*
|
80
|
-
*
|
80
|
+
* TODO:
|
81
|
+
* Was used by with IE8- and Opera. React believed Happy DOM was a legacy browser and used them, but that is no longer the case, so we should remove this method after that this is verified.
|
81
82
|
*
|
83
|
+
* @deprecated
|
82
84
|
* @param type Event type.
|
83
85
|
* @param listener Listener.
|
84
86
|
*/
|
85
87
|
public attachEvent(type: string, listener: ((event: Event) => void) | IEventListener): void {
|
86
88
|
this.addEventListener(type.replace('on', ''), listener);
|
87
89
|
}
|
90
|
+
|
91
|
+
/**
|
92
|
+
* Removes an event listener.
|
93
|
+
*
|
94
|
+
* TODO:
|
95
|
+
* Was used by IE8- and Opera. React believed Happy DOM was a legacy browser and used them, but that is no longer the case, so we should remove this method after that this is verified.
|
96
|
+
*
|
97
|
+
* @deprecated
|
98
|
+
* @param type Event type.
|
99
|
+
* @param listener Listener.
|
100
|
+
*/
|
101
|
+
public detachEvent(type: string, listener: ((event: Event) => void) | IEventListener): void {
|
102
|
+
this.removeEventListener(type.replace('on', ''), listener);
|
103
|
+
}
|
88
104
|
}
|
@@ -28,4 +28,26 @@ export default interface IEventTarget {
|
|
28
28
|
* @returns The return value is false if event is cancelable and at least one of the event handlers which handled this event called Event.preventDefault().
|
29
29
|
*/
|
30
30
|
dispatchEvent(event: Event): boolean;
|
31
|
+
|
32
|
+
/**
|
33
|
+
* Adds an event listener.
|
34
|
+
*
|
35
|
+
* This is only supported by IE8- and Opera, but for some reason React uses it and calls it, so therefore we will keep support for it until they stop using it.
|
36
|
+
*
|
37
|
+
* @deprecated
|
38
|
+
* @param type Event type.
|
39
|
+
* @param listener Listener.
|
40
|
+
*/
|
41
|
+
attachEvent(type: string, listener: ((event: Event) => void) | IEventListener): void;
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Removes an event listener.
|
45
|
+
*
|
46
|
+
* This is only supported by IE8- and Opera, but for some reason React uses it and calls it, so therefore we will keep support for it until they stop using it.
|
47
|
+
*
|
48
|
+
* @deprecated
|
49
|
+
* @param type Event type.
|
50
|
+
* @param listener Listener.
|
51
|
+
*/
|
52
|
+
detachEvent(type: string, listener: ((event: Event) => void) | IEventListener): void;
|
31
53
|
}
|
@@ -56,6 +56,10 @@ export default abstract class CharacterData extends Node implements ICharacterDa
|
|
56
56
|
const oldValue = this._data;
|
57
57
|
this._data = data;
|
58
58
|
|
59
|
+
if (this.isConnected) {
|
60
|
+
this.ownerDocument['_cacheID']++;
|
61
|
+
}
|
62
|
+
|
59
63
|
// MutationObserver
|
60
64
|
if (this._observers.length > 0) {
|
61
65
|
for (const observer of this._observers) {
|