happy-dom 2.43.0 → 2.43.1
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.
@@ -25,6 +25,14 @@ export default class SelectorItem {
|
|
25
25
|
* @returns TRUE if matching.
|
26
26
|
*/
|
27
27
|
match(element: Element): boolean;
|
28
|
+
/**
|
29
|
+
* Matches a psuedo selector.
|
30
|
+
*
|
31
|
+
* @param element Element.
|
32
|
+
* @param selector Selector.
|
33
|
+
* @returns True if it is a match.
|
34
|
+
*/
|
35
|
+
private matchesPsuedo;
|
28
36
|
/**
|
29
37
|
* Matches a nth-child selector.
|
30
38
|
*
|
@@ -35,13 +43,13 @@ export default class SelectorItem {
|
|
35
43
|
*/
|
36
44
|
private matchesNthChild;
|
37
45
|
/**
|
38
|
-
* Matches a psuedo selector.
|
46
|
+
* Matches a psuedo selector expression.
|
39
47
|
*
|
40
48
|
* @param element Element.
|
41
49
|
* @param psuedo Psuedo name.
|
42
50
|
* @returns True if it is a match.
|
43
51
|
*/
|
44
|
-
private
|
52
|
+
private matchesPsuedoExpression;
|
45
53
|
/**
|
46
54
|
* Matches attribute.
|
47
55
|
*
|
@@ -50,6 +58,14 @@ export default class SelectorItem {
|
|
50
58
|
* @returns True if it is a match.
|
51
59
|
*/
|
52
60
|
private matchesAttribute;
|
61
|
+
/**
|
62
|
+
* Matches class.
|
63
|
+
*
|
64
|
+
* @param element Element.
|
65
|
+
* @param selector Selector.
|
66
|
+
* @returns True if it is a match.
|
67
|
+
*/
|
68
|
+
private matchesClass;
|
53
69
|
/**
|
54
70
|
* Matches attribute name only.
|
55
71
|
*
|
@@ -20,10 +20,10 @@ var SelectorItem = /** @class */ (function () {
|
|
20
20
|
*/
|
21
21
|
function SelectorItem(selector) {
|
22
22
|
this.tagName = null;
|
23
|
+
var isNotPseudo = selector.includes(':not(');
|
23
24
|
this.isAll = selector === '*';
|
24
25
|
this.isID = !this.isAll ? selector.startsWith('#') : false;
|
25
|
-
this.isAttribute =
|
26
|
-
!this.isAll && !this.isID && selector.includes('[') && !selector.includes(':not(');
|
26
|
+
this.isAttribute = !this.isAll && !this.isID && selector.includes('[') && !isNotPseudo;
|
27
27
|
this.isPseudo = !this.isAll && !this.isID && selector.includes(':');
|
28
28
|
this.isClass = !this.isAll && !this.isID && new RegExp(CLASS_REGEXP, 'g').test(selector);
|
29
29
|
this.tagName = !this.isAll && !this.isID ? selector.match(TAG_NAME_REGEXP) : null;
|
@@ -40,7 +40,6 @@ var SelectorItem = /** @class */ (function () {
|
|
40
40
|
*/
|
41
41
|
SelectorItem.prototype.match = function (element) {
|
42
42
|
var selector = this.selector;
|
43
|
-
var match;
|
44
43
|
// Is all (*)
|
45
44
|
if (this.isAll) {
|
46
45
|
return true;
|
@@ -56,28 +55,12 @@ var SelectorItem = /** @class */ (function () {
|
|
56
55
|
}
|
57
56
|
}
|
58
57
|
// Class match
|
59
|
-
if (this.isClass) {
|
60
|
-
|
61
|
-
while ((match = regexp.exec(selector))) {
|
62
|
-
if (!element.classList.contains(match[1])) {
|
63
|
-
return false;
|
64
|
-
}
|
65
|
-
}
|
58
|
+
if (this.isClass && !this.matchesClass(element, selector)) {
|
59
|
+
return false;
|
66
60
|
}
|
67
61
|
// Pseudo match
|
68
|
-
if (this.isPseudo) {
|
69
|
-
|
70
|
-
while ((match = regexp.exec(selector))) {
|
71
|
-
if (match[1] && !this.matchesNthChild(element, match[1], match[2])) {
|
72
|
-
return false;
|
73
|
-
}
|
74
|
-
else if (match[3] && this.matchesAttribute(element, match[3])) {
|
75
|
-
return false;
|
76
|
-
}
|
77
|
-
else if (match[4] && !this.matchesPsuedo(element, match[4])) {
|
78
|
-
return false;
|
79
|
-
}
|
80
|
-
}
|
62
|
+
if (this.isPseudo && !this.matchesPsuedo(element, selector)) {
|
63
|
+
return false;
|
81
64
|
}
|
82
65
|
// Attribute match
|
83
66
|
if (this.isAttribute && !this.matchesAttribute(element, selector)) {
|
@@ -85,6 +68,32 @@ var SelectorItem = /** @class */ (function () {
|
|
85
68
|
}
|
86
69
|
return true;
|
87
70
|
};
|
71
|
+
/**
|
72
|
+
* Matches a psuedo selector.
|
73
|
+
*
|
74
|
+
* @param element Element.
|
75
|
+
* @param selector Selector.
|
76
|
+
* @returns True if it is a match.
|
77
|
+
*/
|
78
|
+
SelectorItem.prototype.matchesPsuedo = function (element, selector) {
|
79
|
+
var regexp = new RegExp(PSUEDO_REGEXP, 'g');
|
80
|
+
var match;
|
81
|
+
while ((match = regexp.exec(selector))) {
|
82
|
+
var isNotClass = match[3] && match[3].trim()[0] === '.';
|
83
|
+
if (match[1] && !this.matchesNthChild(element, match[1], match[2])) {
|
84
|
+
return false;
|
85
|
+
}
|
86
|
+
else if (match[3] &&
|
87
|
+
((isNotClass && this.matchesClass(element, match[3])) ||
|
88
|
+
(!isNotClass && this.matchesAttribute(element, match[3])))) {
|
89
|
+
return false;
|
90
|
+
}
|
91
|
+
else if (match[4] && !this.matchesPsuedoExpression(element, match[4])) {
|
92
|
+
return false;
|
93
|
+
}
|
94
|
+
}
|
95
|
+
return true;
|
96
|
+
};
|
88
97
|
/**
|
89
98
|
* Matches a nth-child selector.
|
90
99
|
*
|
@@ -136,13 +145,13 @@ var SelectorItem = /** @class */ (function () {
|
|
136
145
|
return children[number - 1] === element;
|
137
146
|
};
|
138
147
|
/**
|
139
|
-
* Matches a psuedo selector.
|
148
|
+
* Matches a psuedo selector expression.
|
140
149
|
*
|
141
150
|
* @param element Element.
|
142
151
|
* @param psuedo Psuedo name.
|
143
152
|
* @returns True if it is a match.
|
144
153
|
*/
|
145
|
-
SelectorItem.prototype.
|
154
|
+
SelectorItem.prototype.matchesPsuedoExpression = function (element, psuedo) {
|
146
155
|
var parent = element.parentNode;
|
147
156
|
if (!parent) {
|
148
157
|
return false;
|
@@ -207,6 +216,26 @@ var SelectorItem = /** @class */ (function () {
|
|
207
216
|
}
|
208
217
|
return true;
|
209
218
|
};
|
219
|
+
/**
|
220
|
+
* Matches class.
|
221
|
+
*
|
222
|
+
* @param element Element.
|
223
|
+
* @param selector Selector.
|
224
|
+
* @returns True if it is a match.
|
225
|
+
*/
|
226
|
+
SelectorItem.prototype.matchesClass = function (element, selector) {
|
227
|
+
var regexp = new RegExp(CLASS_REGEXP, 'g');
|
228
|
+
var classList = element.className.split(' ');
|
229
|
+
var previousIndex = 0;
|
230
|
+
var match;
|
231
|
+
while ((match = regexp.exec(selector)) && match.index === previousIndex) {
|
232
|
+
if (!classList.includes(match[1])) {
|
233
|
+
return false;
|
234
|
+
}
|
235
|
+
previousIndex = match.index + match[0].length - 1;
|
236
|
+
}
|
237
|
+
return true;
|
238
|
+
};
|
210
239
|
/**
|
211
240
|
* Matches attribute name only.
|
212
241
|
*
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SelectorItem.js","sourceRoot":"","sources":["../../src/query-selector/SelectorItem.ts"],"names":[],"mappings":";;;;;AAAA,2EAAqD;AAGrD,IAAM,gBAAgB,GAAG,6FAA6F,CAAC;AACvH,IAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAChD,IAAM,aAAa,GAAG,sEAAsE,CAAC;AAC7F,IAAM,YAAY,GAAG,sBAAsB,CAAC;AAC5C,IAAM,eAAe,GAAG,gBAAgB,CAAC;AAEzC;;GAEG;AACH;IAWC;;;;OAIG;IACH,sBAAY,QAAgB;QATpB,YAAO,GAAG,IAAI,CAAC;QAUtB,IAAI,CAAC,KAAK,GAAG,QAAQ,KAAK,GAAG,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3D,IAAI,CAAC,WAAW
|
1
|
+
{"version":3,"file":"SelectorItem.js","sourceRoot":"","sources":["../../src/query-selector/SelectorItem.ts"],"names":[],"mappings":";;;;;AAAA,2EAAqD;AAGrD,IAAM,gBAAgB,GAAG,6FAA6F,CAAC;AACvH,IAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAChD,IAAM,aAAa,GAAG,sEAAsE,CAAC;AAC7F,IAAM,YAAY,GAAG,sBAAsB,CAAC;AAC5C,IAAM,eAAe,GAAG,gBAAgB,CAAC;AAEzC;;GAEG;AACH;IAWC;;;;OAIG;IACH,sBAAY,QAAgB;QATpB,YAAO,GAAG,IAAI,CAAC;QAUtB,IAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE/C,IAAI,CAAC,KAAK,GAAG,QAAQ,KAAK,GAAG,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3D,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;QACvF,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzF,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,CAAC;IAED;;;;;OAKG;IACI,4BAAK,GAAZ,UAAa,OAAgB;QAC5B,IAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/B,aAAa;QACb,IAAI,IAAI,CAAC,KAAK,EAAE;YACf,OAAO,IAAI,CAAC;SACZ;QAED,WAAW;QACX,IAAI,IAAI,CAAC,IAAI,EAAE;YACd,OAAO,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;SAC9B;QAED,iBAAiB;QACjB,IAAI,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE;gBACrC,OAAO,KAAK,CAAC;aACb;SACD;QAED,cAAc;QACd,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;YAC1D,OAAO,KAAK,CAAC;SACb;QAED,eAAe;QACf,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;YAC5D,OAAO,KAAK,CAAC;SACb;QAED,kBAAkB;QAClB,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;YAClE,OAAO,KAAK,CAAC;SACb;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;OAMG;IACK,oCAAa,GAArB,UAAsB,OAAgB,EAAE,QAAgB;QACvD,IAAM,MAAM,GAAG,IAAI,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC9C,IAAI,KAAuB,CAAC;QAE5B,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE;YACvC,IAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;YAC1D,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;gBACnE,OAAO,KAAK,CAAC;aACb;iBAAM,IACN,KAAK,CAAC,CAAC,CAAC;gBACR,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBACpD,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC1D;gBACD,OAAO,KAAK,CAAC;aACb;iBAAM,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;gBACxE,OAAO,KAAK,CAAC;aACb;SACD;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;;OAOG;IACK,sCAAe,GAAvB,UAAwB,OAAgB,EAAE,MAAc,EAAE,KAAa;QACtE,IAAI,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAW,OAAO,CAAC,UAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAEhF,QAAQ,MAAM,CAAC,WAAW,EAAE,EAAE;YAC7B,KAAK,aAAa;gBACjB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAA,KAAK,IAAI,OAAA,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAjC,CAAiC,CAAC,CAAC;gBACvE,MAAM;YACP,KAAK,gBAAgB;gBACpB,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;gBAC9B,MAAM;YACP,KAAK,kBAAkB;gBACtB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAA,KAAK,IAAI,OAAA,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAjC,CAAiC,CAAC,CAAC,OAAO,EAAE,CAAC;gBACjF,MAAM;SACP;QAED,IAAI,KAAK,KAAK,KAAK,EAAE;YACpB,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SAC7C;aAAM,IAAI,KAAK,KAAK,MAAM,EAAE;YAC5B,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SAC7C;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACzB,IAAA,KAAS,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAA1C,CAAC,QAAA,EAAE,CAAC,QAAsC,CAAC;YAClD,IAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAM,OAAO,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE;gBACrC,MAAM,IAAI,sBAAY,CAAC,yBAAiB,IAAI,CAAC,QAAQ,qBAAiB,CAAC,CAAC;aACxE;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,OAAO,EAAE;gBAC9D,IAAI,UAAU,KAAK,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE;oBACnC,OAAO,IAAI,CAAC;iBACZ;aACD;YAED,OAAO,KAAK,CAAC;SACb;QAED,IAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAE7B,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE;YAClB,MAAM,IAAI,sBAAY,CAAC,yBAAiB,IAAI,CAAC,QAAQ,qBAAiB,CAAC,CAAC;SACxE;QAED,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,OAAO,CAAC;IACzC,CAAC;IAED;;;;;;OAMG;IACK,8CAAuB,GAA/B,UAAgC,OAAgB,EAAE,MAAc;QAC/D,IAAM,MAAM,GAAY,OAAO,CAAC,UAAU,CAAC;QAE3C,IAAI,CAAC,MAAM,EAAE;YACZ,OAAO,KAAK,CAAC;SACb;QAED,QAAQ,MAAM,CAAC,WAAW,EAAE,EAAE;YAC7B,KAAK,aAAa;gBACjB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC;YACvC,KAAK,YAAY;gBAChB,IAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAC1C,OAAO,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,OAAO,CAAC;YACpE,KAAK,YAAY;gBAChB,IAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAC1C,OAAO,iBAAiB,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC;YAC3E,KAAK,eAAe;gBACnB,KAAoB,UAAe,EAAf,KAAA,MAAM,CAAC,QAAQ,EAAf,cAAe,EAAf,IAAe,EAAE;oBAAhC,IAAM,KAAK,SAAA;oBACf,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE;wBACtC,OAAO,KAAK,KAAK,OAAO,CAAC;qBACzB;iBACD;gBACD,OAAO,KAAK,CAAC;YACd,KAAK,cAAc;gBAClB,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;oBACrD,IAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBACjC,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE;wBACtC,OAAO,KAAK,KAAK,OAAO,CAAC;qBACzB;iBACD;gBACD,OAAO,KAAK,CAAC;YACd,KAAK,cAAc;gBAClB,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,KAAoB,UAAe,EAAf,KAAA,MAAM,CAAC,QAAQ,EAAf,cAAe,EAAf,IAAe,EAAE;oBAAhC,IAAM,KAAK,SAAA;oBACf,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE;wBACtC,IAAI,OAAO,IAAI,KAAK,KAAK,OAAO,EAAE;4BACjC,OAAO,KAAK,CAAC;yBACb;wBACD,OAAO,GAAG,IAAI,CAAC;qBACf;iBACD;gBACD,OAAO,OAAO,CAAC;SAChB;QAED,OAAO,KAAK,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACK,uCAAgB,GAAxB,UAAyB,OAAgB,EAAE,QAAgB;QAC1D,IAAM,MAAM,GAAG,IAAI,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QACjD,IAAI,KAAuB,CAAC;QAE5B,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE;YACvC,IAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC;YAClE,IACC,CAAC,QAAQ;gBACT,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3D,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACxF;gBACD,OAAO,KAAK,CAAC;aACb;SACD;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;OAMG;IACK,mCAAY,GAApB,UAAqB,OAAgB,EAAE,QAAgB;QACtD,IAAM,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAC7C,IAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,KAAuB,CAAC;QAE5B,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,aAAa,EAAE;YACxE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;gBAClC,OAAO,KAAK,CAAC;aACb;YACD,aAAa,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SAClD;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;OAMG;IACK,2CAAoB,GAA5B,UAA6B,OAAgB,EAAE,aAAqB;QACnE,IAAI,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;YAC9C,MAAM,IAAI,sBAAY,CAAC,yBAAiB,IAAI,CAAC,QAAQ,qBAAiB,CAAC,CAAC;SACxE;QAED,OAAO,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;;;;;OASG;IACK,mDAA4B,GAApC,UACC,OAAgB,EAChB,aAAqB,EACrB,cAAsB,EACtB,SAAwB;QAAxB,0BAAA,EAAA,gBAAwB;QAExB,IAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC;QACnE,IAAM,KAAK,GAAG,cAAc,CAAC;QAE7B,IAAI,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;YAC9C,MAAM,IAAI,sBAAY,CAAC,yBAAiB,IAAI,CAAC,QAAQ,qBAAiB,CAAC,CAAC;SACxE;QAED,IAAI,CAAC,SAAS,EAAE;YACf,OAAO,KAAK,CAAC;SACb;QAED,IAAI,SAAS,EAAE;YACd,QAAQ,SAAS,EAAE;gBAClB,oDAAoD;gBACpD,KAAK,GAAG;oBACP,OAAO,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACtE,yDAAyD;gBACzD,KAAK,GAAG;oBACP,OAAO,SAAS,IAAI,SAAS,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,WAAI,KAAK,SAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC1F,wDAAwD;gBACxD,KAAK,GAAG;oBACP,OAAO,SAAS,IAAI,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAC1E,sDAAsD;gBACtD,KAAK,GAAG;oBACP,OAAO,SAAS,IAAI,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACxE,qDAAqD;gBACrD,KAAK,GAAG;oBACP,OAAO,SAAS,IAAI,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aACxE;SACD;QAED,OAAO,SAAS,IAAI,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC;IAC/C,CAAC;IACF,mBAAC;AAAD,CAAC,AAtUD,IAsUC"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "happy-dom",
|
3
|
-
"version": "2.43.
|
3
|
+
"version": "2.43.1",
|
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": "^26.5.6",
|
76
76
|
"typescript": "^4.2.4"
|
77
77
|
},
|
78
|
-
"gitHead": "
|
78
|
+
"gitHead": "784370f5b561d513c09f28c44b59d7c4a167245a"
|
79
79
|
}
|
@@ -27,10 +27,11 @@ export default class SelectorItem {
|
|
27
27
|
* @param selector Selector.
|
28
28
|
*/
|
29
29
|
constructor(selector: string) {
|
30
|
+
const isNotPseudo = selector.includes(':not(');
|
31
|
+
|
30
32
|
this.isAll = selector === '*';
|
31
33
|
this.isID = !this.isAll ? selector.startsWith('#') : false;
|
32
|
-
this.isAttribute =
|
33
|
-
!this.isAll && !this.isID && selector.includes('[') && !selector.includes(':not(');
|
34
|
+
this.isAttribute = !this.isAll && !this.isID && selector.includes('[') && !isNotPseudo;
|
34
35
|
this.isPseudo = !this.isAll && !this.isID && selector.includes(':');
|
35
36
|
this.isClass = !this.isAll && !this.isID && new RegExp(CLASS_REGEXP, 'g').test(selector);
|
36
37
|
this.tagName = !this.isAll && !this.isID ? selector.match(TAG_NAME_REGEXP) : null;
|
@@ -48,7 +49,6 @@ export default class SelectorItem {
|
|
48
49
|
*/
|
49
50
|
public match(element: Element): boolean {
|
50
51
|
const selector = this.selector;
|
51
|
-
let match;
|
52
52
|
|
53
53
|
// Is all (*)
|
54
54
|
if (this.isAll) {
|
@@ -68,29 +68,13 @@ export default class SelectorItem {
|
|
68
68
|
}
|
69
69
|
|
70
70
|
// Class match
|
71
|
-
if (this.isClass) {
|
72
|
-
|
73
|
-
|
74
|
-
while ((match = regexp.exec(selector))) {
|
75
|
-
if (!element.classList.contains(match[1])) {
|
76
|
-
return false;
|
77
|
-
}
|
78
|
-
}
|
71
|
+
if (this.isClass && !this.matchesClass(element, selector)) {
|
72
|
+
return false;
|
79
73
|
}
|
80
74
|
|
81
75
|
// Pseudo match
|
82
|
-
if (this.isPseudo) {
|
83
|
-
|
84
|
-
|
85
|
-
while ((match = regexp.exec(selector))) {
|
86
|
-
if (match[1] && !this.matchesNthChild(element, match[1], match[2])) {
|
87
|
-
return false;
|
88
|
-
} else if (match[3] && this.matchesAttribute(element, match[3])) {
|
89
|
-
return false;
|
90
|
-
} else if (match[4] && !this.matchesPsuedo(element, match[4])) {
|
91
|
-
return false;
|
92
|
-
}
|
93
|
-
}
|
76
|
+
if (this.isPseudo && !this.matchesPsuedo(element, selector)) {
|
77
|
+
return false;
|
94
78
|
}
|
95
79
|
|
96
80
|
// Attribute match
|
@@ -101,6 +85,35 @@ export default class SelectorItem {
|
|
101
85
|
return true;
|
102
86
|
}
|
103
87
|
|
88
|
+
/**
|
89
|
+
* Matches a psuedo selector.
|
90
|
+
*
|
91
|
+
* @param element Element.
|
92
|
+
* @param selector Selector.
|
93
|
+
* @returns True if it is a match.
|
94
|
+
*/
|
95
|
+
private matchesPsuedo(element: Element, selector: string): boolean {
|
96
|
+
const regexp = new RegExp(PSUEDO_REGEXP, 'g');
|
97
|
+
let match: RegExpMatchArray;
|
98
|
+
|
99
|
+
while ((match = regexp.exec(selector))) {
|
100
|
+
const isNotClass = match[3] && match[3].trim()[0] === '.';
|
101
|
+
if (match[1] && !this.matchesNthChild(element, match[1], match[2])) {
|
102
|
+
return false;
|
103
|
+
} else if (
|
104
|
+
match[3] &&
|
105
|
+
((isNotClass && this.matchesClass(element, match[3])) ||
|
106
|
+
(!isNotClass && this.matchesAttribute(element, match[3])))
|
107
|
+
) {
|
108
|
+
return false;
|
109
|
+
} else if (match[4] && !this.matchesPsuedoExpression(element, match[4])) {
|
110
|
+
return false;
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
return true;
|
115
|
+
}
|
116
|
+
|
104
117
|
/**
|
105
118
|
* Matches a nth-child selector.
|
106
119
|
*
|
@@ -158,13 +171,13 @@ export default class SelectorItem {
|
|
158
171
|
}
|
159
172
|
|
160
173
|
/**
|
161
|
-
* Matches a psuedo selector.
|
174
|
+
* Matches a psuedo selector expression.
|
162
175
|
*
|
163
176
|
* @param element Element.
|
164
177
|
* @param psuedo Psuedo name.
|
165
178
|
* @returns True if it is a match.
|
166
179
|
*/
|
167
|
-
private
|
180
|
+
private matchesPsuedoExpression(element: Element, psuedo: string): boolean {
|
168
181
|
const parent = <Element>element.parentNode;
|
169
182
|
|
170
183
|
if (!parent) {
|
@@ -220,7 +233,7 @@ export default class SelectorItem {
|
|
220
233
|
*/
|
221
234
|
private matchesAttribute(element: Element, selector: string): boolean {
|
222
235
|
const regexp = new RegExp(ATTRIBUTE_REGEXP, 'g');
|
223
|
-
let match;
|
236
|
+
let match: RegExpMatchArray;
|
224
237
|
|
225
238
|
while ((match = regexp.exec(selector))) {
|
226
239
|
const isPsuedo = match.index > 0 && selector[match.index] === '(';
|
@@ -236,6 +249,29 @@ export default class SelectorItem {
|
|
236
249
|
return true;
|
237
250
|
}
|
238
251
|
|
252
|
+
/**
|
253
|
+
* Matches class.
|
254
|
+
*
|
255
|
+
* @param element Element.
|
256
|
+
* @param selector Selector.
|
257
|
+
* @returns True if it is a match.
|
258
|
+
*/
|
259
|
+
private matchesClass(element: Element, selector: string): boolean {
|
260
|
+
const regexp = new RegExp(CLASS_REGEXP, 'g');
|
261
|
+
const classList = element.className.split(' ');
|
262
|
+
let previousIndex = 0;
|
263
|
+
let match: RegExpMatchArray;
|
264
|
+
|
265
|
+
while ((match = regexp.exec(selector)) && match.index === previousIndex) {
|
266
|
+
if (!classList.includes(match[1])) {
|
267
|
+
return false;
|
268
|
+
}
|
269
|
+
previousIndex = match.index + match[0].length - 1;
|
270
|
+
}
|
271
|
+
|
272
|
+
return true;
|
273
|
+
}
|
274
|
+
|
239
275
|
/**
|
240
276
|
* Matches attribute name only.
|
241
277
|
*
|