happy-dom 14.3.3 → 14.3.4
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/cjs/css/declaration/element-style/CSSStyleDeclarationElementStyle.cjs +5 -3
- package/cjs/css/declaration/element-style/CSSStyleDeclarationElementStyle.cjs.map +1 -1
- package/cjs/css/declaration/element-style/CSSStyleDeclarationElementStyle.d.ts.map +1 -1
- package/cjs/nodes/element/Element.cjs +2 -2
- package/cjs/nodes/element/Element.cjs.map +1 -1
- package/cjs/query-selector/QuerySelector.cjs +10 -4
- package/cjs/query-selector/QuerySelector.cjs.map +1 -1
- package/cjs/query-selector/QuerySelector.d.ts +5 -1
- package/cjs/query-selector/QuerySelector.d.ts.map +1 -1
- package/cjs/query-selector/SelectorItem.cjs +9 -4
- package/cjs/query-selector/SelectorItem.cjs.map +1 -1
- package/cjs/query-selector/SelectorItem.d.ts +4 -1
- package/cjs/query-selector/SelectorItem.d.ts.map +1 -1
- package/cjs/query-selector/SelectorParser.cjs +39 -18
- package/cjs/query-selector/SelectorParser.cjs.map +1 -1
- package/cjs/query-selector/SelectorParser.d.ts +12 -2
- package/cjs/query-selector/SelectorParser.d.ts.map +1 -1
- package/lib/css/declaration/element-style/CSSStyleDeclarationElementStyle.d.ts.map +1 -1
- package/lib/css/declaration/element-style/CSSStyleDeclarationElementStyle.js +5 -3
- package/lib/css/declaration/element-style/CSSStyleDeclarationElementStyle.js.map +1 -1
- package/lib/nodes/element/Element.js +2 -2
- package/lib/nodes/element/Element.js.map +1 -1
- package/lib/query-selector/QuerySelector.d.ts +5 -1
- package/lib/query-selector/QuerySelector.d.ts.map +1 -1
- package/lib/query-selector/QuerySelector.js +10 -4
- package/lib/query-selector/QuerySelector.js.map +1 -1
- package/lib/query-selector/SelectorItem.d.ts +4 -1
- package/lib/query-selector/SelectorItem.d.ts.map +1 -1
- package/lib/query-selector/SelectorItem.js +9 -4
- package/lib/query-selector/SelectorItem.js.map +1 -1
- package/lib/query-selector/SelectorParser.d.ts +12 -2
- package/lib/query-selector/SelectorParser.d.ts.map +1 -1
- package/lib/query-selector/SelectorParser.js +39 -18
- package/lib/query-selector/SelectorParser.js.map +1 -1
- package/package.json +1 -1
- package/src/css/declaration/element-style/CSSStyleDeclarationElementStyle.ts +5 -3
- package/src/nodes/element/Element.ts +2 -2
- package/src/query-selector/QuerySelector.ts +15 -4
- package/src/query-selector/SelectorItem.ts +15 -4
- package/src/query-selector/SelectorParser.ts +49 -18
@@ -55,36 +55,44 @@ export default class SelectorParser {
|
|
55
55
|
* Parses a selector string and returns an instance of SelectorItem.
|
56
56
|
*
|
57
57
|
* @param selector Selector.
|
58
|
+
* @param [options] Options.
|
59
|
+
* @param [options.ignoreErrors] Ignores errors.
|
58
60
|
* @returns Selector item.
|
59
61
|
*/
|
60
|
-
static getSelectorItem(selector) {
|
61
|
-
return this.getSelectorGroups(selector)[0][0];
|
62
|
+
static getSelectorItem(selector, options) {
|
63
|
+
return this.getSelectorGroups(selector, options)[0][0];
|
62
64
|
}
|
63
65
|
/**
|
64
66
|
* Parses a selector string and returns groups with SelectorItem instances.
|
65
67
|
*
|
66
68
|
* @param selector Selector.
|
69
|
+
* @param [options] Options.
|
70
|
+
* @param [options.ignoreErrors] Ignores errors.
|
67
71
|
* @returns Selector groups.
|
68
72
|
*/
|
69
|
-
static getSelectorGroups(selector) {
|
73
|
+
static getSelectorGroups(selector, options) {
|
74
|
+
const ignoreErrors = options?.ignoreErrors;
|
70
75
|
if (selector === '*') {
|
71
|
-
return [[new SelectorItem({ tagName: '*' })]];
|
76
|
+
return [[new SelectorItem({ tagName: '*', ignoreErrors })]];
|
72
77
|
}
|
73
78
|
const simpleMatch = selector.match(SIMPLE_SELECTOR_REGEXP);
|
74
79
|
if (simpleMatch) {
|
75
80
|
if (simpleMatch[1]) {
|
76
|
-
return [[new SelectorItem({ tagName: selector.toUpperCase() })]];
|
81
|
+
return [[new SelectorItem({ tagName: selector.toUpperCase(), ignoreErrors })]];
|
77
82
|
}
|
78
83
|
else if (simpleMatch[2]) {
|
79
|
-
return [
|
84
|
+
return [
|
85
|
+
[new SelectorItem({ classNames: selector.replace('.', '').split('.'), ignoreErrors })]
|
86
|
+
];
|
80
87
|
}
|
81
88
|
else if (simpleMatch[3]) {
|
82
|
-
return [[new SelectorItem({ id: selector.replace('#', '') })]];
|
89
|
+
return [[new SelectorItem({ id: selector.replace('#', ''), ignoreErrors })]];
|
83
90
|
}
|
84
91
|
}
|
85
92
|
const regexp = new RegExp(SELECTOR_REGEXP);
|
86
93
|
let currentSelectorItem = new SelectorItem({
|
87
|
-
combinator: SelectorCombinatorEnum.descendant
|
94
|
+
combinator: SelectorCombinatorEnum.descendant,
|
95
|
+
ignoreErrors
|
88
96
|
});
|
89
97
|
let currentGroup = [currentSelectorItem];
|
90
98
|
const groups = [currentGroup];
|
@@ -142,11 +150,11 @@ export default class SelectorParser {
|
|
142
150
|
}
|
143
151
|
else if (match[13] && match[14]) {
|
144
152
|
currentSelectorItem.pseudos = currentSelectorItem.pseudos || [];
|
145
|
-
currentSelectorItem.pseudos.push(this.getPseudo(match[13], match[14]));
|
153
|
+
currentSelectorItem.pseudos.push(this.getPseudo(match[13], match[14], options));
|
146
154
|
}
|
147
155
|
else if (match[15]) {
|
148
156
|
currentSelectorItem.pseudos = currentSelectorItem.pseudos || [];
|
149
|
-
currentSelectorItem.pseudos.push(this.getPseudo(match[15]));
|
157
|
+
currentSelectorItem.pseudos.push(this.getPseudo(match[15], null, options));
|
150
158
|
}
|
151
159
|
else if (match[16]) {
|
152
160
|
currentSelectorItem.isPseudoElement = true;
|
@@ -155,24 +163,30 @@ export default class SelectorParser {
|
|
155
163
|
switch (match[17].trim()) {
|
156
164
|
case ',':
|
157
165
|
currentSelectorItem = new SelectorItem({
|
158
|
-
combinator: SelectorCombinatorEnum.descendant
|
166
|
+
combinator: SelectorCombinatorEnum.descendant,
|
167
|
+
ignoreErrors
|
159
168
|
});
|
160
169
|
currentGroup = [currentSelectorItem];
|
161
170
|
groups.push(currentGroup);
|
162
171
|
break;
|
163
172
|
case '>':
|
164
|
-
currentSelectorItem = new SelectorItem({
|
173
|
+
currentSelectorItem = new SelectorItem({
|
174
|
+
combinator: SelectorCombinatorEnum.child,
|
175
|
+
ignoreErrors
|
176
|
+
});
|
165
177
|
currentGroup.push(currentSelectorItem);
|
166
178
|
break;
|
167
179
|
case '+':
|
168
180
|
currentSelectorItem = new SelectorItem({
|
169
|
-
combinator: SelectorCombinatorEnum.adjacentSibling
|
181
|
+
combinator: SelectorCombinatorEnum.adjacentSibling,
|
182
|
+
ignoreErrors
|
170
183
|
});
|
171
184
|
currentGroup.push(currentSelectorItem);
|
172
185
|
break;
|
173
186
|
case '':
|
174
187
|
currentSelectorItem = new SelectorItem({
|
175
|
-
combinator: SelectorCombinatorEnum.descendant
|
188
|
+
combinator: SelectorCombinatorEnum.descendant,
|
189
|
+
ignoreErrors
|
176
190
|
});
|
177
191
|
currentGroup.push(currentSelectorItem);
|
178
192
|
break;
|
@@ -184,6 +198,9 @@ export default class SelectorParser {
|
|
184
198
|
}
|
185
199
|
}
|
186
200
|
if (!isValid) {
|
201
|
+
if (options?.ignoreErrors) {
|
202
|
+
return [];
|
203
|
+
}
|
187
204
|
throw new DOMException(`Invalid selector: "${selector}"`);
|
188
205
|
}
|
189
206
|
return groups;
|
@@ -227,9 +244,11 @@ export default class SelectorParser {
|
|
227
244
|
*
|
228
245
|
* @param name Pseudo name.
|
229
246
|
* @param args Pseudo arguments.
|
247
|
+
* @param [options] Options.
|
248
|
+
* @param [options.ignoreErrors] Ignores errors.
|
230
249
|
* @returns Pseudo.
|
231
250
|
*/
|
232
|
-
static getPseudo(name, args) {
|
251
|
+
static getPseudo(name, args, options) {
|
233
252
|
const lowerName = name.toLowerCase();
|
234
253
|
if (!args) {
|
235
254
|
return { name: lowerName, arguments: null, selectorItems: null, nthFunction: null };
|
@@ -239,7 +258,9 @@ export default class SelectorParser {
|
|
239
258
|
case 'nth-child':
|
240
259
|
const nthOfIndex = args.indexOf(' of ');
|
241
260
|
const nthFunction = nthOfIndex !== -1 ? args.substring(0, nthOfIndex) : args;
|
242
|
-
const selectorItem = nthOfIndex !== -1
|
261
|
+
const selectorItem = nthOfIndex !== -1
|
262
|
+
? this.getSelectorItem(args.substring(nthOfIndex + 4).trim(), options)
|
263
|
+
: null;
|
243
264
|
return {
|
244
265
|
name: lowerName,
|
245
266
|
arguments: args,
|
@@ -258,12 +279,12 @@ export default class SelectorParser {
|
|
258
279
|
return {
|
259
280
|
name: lowerName,
|
260
281
|
arguments: args,
|
261
|
-
selectorItems: [this.getSelectorItem(args)],
|
282
|
+
selectorItems: [this.getSelectorItem(args, options)],
|
262
283
|
nthFunction: null
|
263
284
|
};
|
264
285
|
case 'is':
|
265
286
|
case 'where':
|
266
|
-
const selectorGroups = this.getSelectorGroups(args);
|
287
|
+
const selectorGroups = this.getSelectorGroups(args, options);
|
267
288
|
const selectorItems = [];
|
268
289
|
for (const group of selectorGroups) {
|
269
290
|
selectorItems.push(group[0]);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SelectorParser.js","sourceRoot":"","sources":["../../src/query-selector/SelectorParser.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,sBAAsB,MAAM,6BAA6B,CAAC;AACjE,OAAO,YAAY,MAAM,8BAA8B,CAAC;AAGxD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,eAAe,GACpB,oSAAoS,CAAC;AAEtS;;GAEG;AACH,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAEvC;;GAEG;AACH,MAAM,YAAY,GAAG;IACpB,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;IACrC,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;IACtC,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B;;;;;;GAMG;AACH,MAAM,sBAAsB,GAAG,6DAA6D,CAAC;AAE7F;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,cAAc;IAClC
|
1
|
+
{"version":3,"file":"SelectorParser.js","sourceRoot":"","sources":["../../src/query-selector/SelectorParser.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -328,11 +328,13 @@ export default class CSSStyleDeclarationElementStyle {
|
|
328
328
|
}
|
329
329
|
} else {
|
330
330
|
for (const element of options.elements) {
|
331
|
-
const
|
332
|
-
|
331
|
+
const match = QuerySelector.matches(<Element>element.element, selectorText, {
|
332
|
+
ignoreErrors: true
|
333
|
+
});
|
334
|
+
if (match) {
|
333
335
|
element.cssTexts.push({
|
334
336
|
cssText: (<CSSStyleRule>rule)[PropertySymbol.cssText],
|
335
|
-
priorityWeight:
|
337
|
+
priorityWeight: match.priorityWeight
|
336
338
|
});
|
337
339
|
}
|
338
340
|
}
|
@@ -851,7 +851,7 @@ export default class Element
|
|
851
851
|
* @returns "true" if matching.
|
852
852
|
*/
|
853
853
|
public matches(selector: string): boolean {
|
854
|
-
return !!QuerySelector.
|
854
|
+
return !!QuerySelector.matches(this, selector);
|
855
855
|
}
|
856
856
|
|
857
857
|
/**
|
@@ -865,7 +865,7 @@ export default class Element
|
|
865
865
|
let parent: Element = this;
|
866
866
|
|
867
867
|
while (parent) {
|
868
|
-
if (QuerySelector.
|
868
|
+
if (QuerySelector.matches(parent, selector)) {
|
869
869
|
return parent;
|
870
870
|
}
|
871
871
|
parent = parent.parentElement;
|
@@ -198,9 +198,15 @@ export default class QuerySelector {
|
|
198
198
|
*
|
199
199
|
* @param element Element to match.
|
200
200
|
* @param selector Selector to match with.
|
201
|
+
* @param [options] Options.
|
202
|
+
* @param [options.ignoreErrors] Ignores errors.
|
201
203
|
* @returns Result.
|
202
204
|
*/
|
203
|
-
public static
|
205
|
+
public static matches(
|
206
|
+
element: Element,
|
207
|
+
selector: string,
|
208
|
+
options?: { ignoreErrors?: boolean }
|
209
|
+
): ISelectorMatch | null {
|
204
210
|
if (!selector) {
|
205
211
|
return null;
|
206
212
|
}
|
@@ -211,14 +217,19 @@ export default class QuerySelector {
|
|
211
217
|
};
|
212
218
|
}
|
213
219
|
|
220
|
+
const ignoreErrors = options?.ignoreErrors;
|
221
|
+
|
214
222
|
if (INVALID_SELECTOR_REGEXP.test(selector)) {
|
223
|
+
if (ignoreErrors) {
|
224
|
+
return null;
|
225
|
+
}
|
215
226
|
throw new Error(
|
216
|
-
`Failed to execute '
|
227
|
+
`Failed to execute 'matches' on '${element.constructor.name}': '${selector}' is not a valid selector.`
|
217
228
|
);
|
218
229
|
}
|
219
230
|
|
220
|
-
for (const items of SelectorParser.getSelectorGroups(selector)) {
|
221
|
-
const result = this.matchSelector(element, element, items.reverse());
|
231
|
+
for (const items of SelectorParser.getSelectorGroups(selector, options)) {
|
232
|
+
const result = this.matchSelector(element, element, items.reverse(), 0);
|
222
233
|
|
223
234
|
if (result) {
|
224
235
|
return result;
|
@@ -18,6 +18,7 @@ export default class SelectorItem {
|
|
18
18
|
public pseudos: ISelectorPseudo[] | null;
|
19
19
|
public isPseudoElement: boolean;
|
20
20
|
public combinator: SelectorCombinatorEnum;
|
21
|
+
public ignoreErrors: boolean;
|
21
22
|
|
22
23
|
/**
|
23
24
|
* Constructor.
|
@@ -30,6 +31,7 @@ export default class SelectorItem {
|
|
30
31
|
* @param [options.attributes] Attributes.
|
31
32
|
* @param [options.pseudos] Pseudos.
|
32
33
|
* @param [options.isPseudoElement] Is pseudo element.
|
34
|
+
* @param [options.ignoreErrors] Ignore errors.
|
33
35
|
*/
|
34
36
|
constructor(options?: {
|
35
37
|
tagName?: string;
|
@@ -39,6 +41,7 @@ export default class SelectorItem {
|
|
39
41
|
pseudos?: ISelectorPseudo[];
|
40
42
|
isPseudoElement?: boolean;
|
41
43
|
combinator?: SelectorCombinatorEnum;
|
44
|
+
ignoreErrors?: boolean;
|
42
45
|
}) {
|
43
46
|
this.tagName = options?.tagName || null;
|
44
47
|
this.id = options?.id || null;
|
@@ -47,6 +50,7 @@ export default class SelectorItem {
|
|
47
50
|
this.pseudos = options?.pseudos || null;
|
48
51
|
this.isPseudoElement = options?.isPseudoElement || false;
|
49
52
|
this.combinator = options?.combinator || SelectorCombinatorEnum.descendant;
|
53
|
+
this.ignoreErrors = options?.ignoreErrors || false;
|
50
54
|
}
|
51
55
|
|
52
56
|
/**
|
@@ -98,7 +102,7 @@ export default class SelectorItem {
|
|
98
102
|
|
99
103
|
// Pseudo match
|
100
104
|
if (this.pseudos) {
|
101
|
-
const result = this.
|
105
|
+
const result = this.matchPseudo(element);
|
102
106
|
if (!result) {
|
103
107
|
return null;
|
104
108
|
}
|
@@ -114,7 +118,7 @@ export default class SelectorItem {
|
|
114
118
|
* @param element Element.
|
115
119
|
* @returns Result.
|
116
120
|
*/
|
117
|
-
private
|
121
|
+
private matchPseudo(element: Element): ISelectorMatch | null {
|
118
122
|
const parent = <Element>element[PropertySymbol.parentNode];
|
119
123
|
const parentChildren = element[PropertySymbol.parentNode]
|
120
124
|
? (<Element>element[PropertySymbol.parentNode])[PropertySymbol.children]
|
@@ -135,7 +139,14 @@ export default class SelectorItem {
|
|
135
139
|
case 'nth-last-child':
|
136
140
|
case 'nth-last-of-type':
|
137
141
|
if (!pseudo.arguments) {
|
138
|
-
|
142
|
+
if (this.ignoreErrors) {
|
143
|
+
return null;
|
144
|
+
}
|
145
|
+
throw new DOMException(
|
146
|
+
`Failed to execute 'matches' on '${
|
147
|
+
element.constructor.name
|
148
|
+
}': '${this.getSelectorString()}' is not a valid selector.`
|
149
|
+
);
|
139
150
|
}
|
140
151
|
break;
|
141
152
|
}
|
@@ -357,7 +368,7 @@ export default class SelectorItem {
|
|
357
368
|
* @returns Selector string.
|
358
369
|
*/
|
359
370
|
private getSelectorString(): string {
|
360
|
-
return `${this.tagName
|
371
|
+
return `${this.tagName ? this.tagName.toLowerCase() : ''}${this.id ? `#${this.id}` : ''}${
|
361
372
|
this.classNames ? `.${this.classNames.join('.')}` : ''
|
362
373
|
}${
|
363
374
|
this.attributes
|
@@ -63,38 +63,52 @@ export default class SelectorParser {
|
|
63
63
|
* Parses a selector string and returns an instance of SelectorItem.
|
64
64
|
*
|
65
65
|
* @param selector Selector.
|
66
|
+
* @param [options] Options.
|
67
|
+
* @param [options.ignoreErrors] Ignores errors.
|
66
68
|
* @returns Selector item.
|
67
69
|
*/
|
68
|
-
public static getSelectorItem(
|
69
|
-
|
70
|
+
public static getSelectorItem(
|
71
|
+
selector: string,
|
72
|
+
options?: { ignoreErrors?: boolean }
|
73
|
+
): SelectorItem {
|
74
|
+
return this.getSelectorGroups(selector, options)[0][0];
|
70
75
|
}
|
71
76
|
|
72
77
|
/**
|
73
78
|
* Parses a selector string and returns groups with SelectorItem instances.
|
74
79
|
*
|
75
80
|
* @param selector Selector.
|
81
|
+
* @param [options] Options.
|
82
|
+
* @param [options.ignoreErrors] Ignores errors.
|
76
83
|
* @returns Selector groups.
|
77
84
|
*/
|
78
|
-
public static getSelectorGroups(
|
85
|
+
public static getSelectorGroups(
|
86
|
+
selector: string,
|
87
|
+
options?: { ignoreErrors?: boolean }
|
88
|
+
): Array<Array<SelectorItem>> {
|
89
|
+
const ignoreErrors = options?.ignoreErrors;
|
79
90
|
if (selector === '*') {
|
80
|
-
return [[new SelectorItem({ tagName: '*' })]];
|
91
|
+
return [[new SelectorItem({ tagName: '*', ignoreErrors })]];
|
81
92
|
}
|
82
93
|
|
83
94
|
const simpleMatch = selector.match(SIMPLE_SELECTOR_REGEXP);
|
84
95
|
|
85
96
|
if (simpleMatch) {
|
86
97
|
if (simpleMatch[1]) {
|
87
|
-
return [[new SelectorItem({ tagName: selector.toUpperCase() })]];
|
98
|
+
return [[new SelectorItem({ tagName: selector.toUpperCase(), ignoreErrors })]];
|
88
99
|
} else if (simpleMatch[2]) {
|
89
|
-
return [
|
100
|
+
return [
|
101
|
+
[new SelectorItem({ classNames: selector.replace('.', '').split('.'), ignoreErrors })]
|
102
|
+
];
|
90
103
|
} else if (simpleMatch[3]) {
|
91
|
-
return [[new SelectorItem({ id: selector.replace('#', '') })]];
|
104
|
+
return [[new SelectorItem({ id: selector.replace('#', ''), ignoreErrors })]];
|
92
105
|
}
|
93
106
|
}
|
94
107
|
|
95
108
|
const regexp = new RegExp(SELECTOR_REGEXP);
|
96
109
|
let currentSelectorItem: SelectorItem = new SelectorItem({
|
97
|
-
combinator: SelectorCombinatorEnum.descendant
|
110
|
+
combinator: SelectorCombinatorEnum.descendant,
|
111
|
+
ignoreErrors
|
98
112
|
});
|
99
113
|
let currentGroup: SelectorItem[] = [currentSelectorItem];
|
100
114
|
const groups: Array<Array<SelectorItem>> = [currentGroup];
|
@@ -147,34 +161,40 @@ export default class SelectorParser {
|
|
147
161
|
});
|
148
162
|
} else if (match[13] && match[14]) {
|
149
163
|
currentSelectorItem.pseudos = currentSelectorItem.pseudos || [];
|
150
|
-
currentSelectorItem.pseudos.push(this.getPseudo(match[13], match[14]));
|
164
|
+
currentSelectorItem.pseudos.push(this.getPseudo(match[13], match[14], options));
|
151
165
|
} else if (match[15]) {
|
152
166
|
currentSelectorItem.pseudos = currentSelectorItem.pseudos || [];
|
153
|
-
currentSelectorItem.pseudos.push(this.getPseudo(match[15]));
|
167
|
+
currentSelectorItem.pseudos.push(this.getPseudo(match[15], null, options));
|
154
168
|
} else if (match[16]) {
|
155
169
|
currentSelectorItem.isPseudoElement = true;
|
156
170
|
} else if (match[17]) {
|
157
171
|
switch (match[17].trim()) {
|
158
172
|
case ',':
|
159
173
|
currentSelectorItem = new SelectorItem({
|
160
|
-
combinator: SelectorCombinatorEnum.descendant
|
174
|
+
combinator: SelectorCombinatorEnum.descendant,
|
175
|
+
ignoreErrors
|
161
176
|
});
|
162
177
|
currentGroup = [currentSelectorItem];
|
163
178
|
groups.push(currentGroup);
|
164
179
|
break;
|
165
180
|
case '>':
|
166
|
-
currentSelectorItem = new SelectorItem({
|
181
|
+
currentSelectorItem = new SelectorItem({
|
182
|
+
combinator: SelectorCombinatorEnum.child,
|
183
|
+
ignoreErrors
|
184
|
+
});
|
167
185
|
currentGroup.push(currentSelectorItem);
|
168
186
|
break;
|
169
187
|
case '+':
|
170
188
|
currentSelectorItem = new SelectorItem({
|
171
|
-
combinator: SelectorCombinatorEnum.adjacentSibling
|
189
|
+
combinator: SelectorCombinatorEnum.adjacentSibling,
|
190
|
+
ignoreErrors
|
172
191
|
});
|
173
192
|
currentGroup.push(currentSelectorItem);
|
174
193
|
break;
|
175
194
|
case '':
|
176
195
|
currentSelectorItem = new SelectorItem({
|
177
|
-
combinator: SelectorCombinatorEnum.descendant
|
196
|
+
combinator: SelectorCombinatorEnum.descendant,
|
197
|
+
ignoreErrors
|
178
198
|
});
|
179
199
|
currentGroup.push(currentSelectorItem);
|
180
200
|
break;
|
@@ -186,6 +206,9 @@ export default class SelectorParser {
|
|
186
206
|
}
|
187
207
|
|
188
208
|
if (!isValid) {
|
209
|
+
if (options?.ignoreErrors) {
|
210
|
+
return [];
|
211
|
+
}
|
189
212
|
throw new DOMException(`Invalid selector: "${selector}"`);
|
190
213
|
}
|
191
214
|
|
@@ -241,9 +264,15 @@ export default class SelectorParser {
|
|
241
264
|
*
|
242
265
|
* @param name Pseudo name.
|
243
266
|
* @param args Pseudo arguments.
|
267
|
+
* @param [options] Options.
|
268
|
+
* @param [options.ignoreErrors] Ignores errors.
|
244
269
|
* @returns Pseudo.
|
245
270
|
*/
|
246
|
-
private static getPseudo(
|
271
|
+
private static getPseudo(
|
272
|
+
name: string,
|
273
|
+
args?: string,
|
274
|
+
options?: { ignoreErrors?: boolean }
|
275
|
+
): ISelectorPseudo {
|
247
276
|
const lowerName = name.toLowerCase();
|
248
277
|
|
249
278
|
if (!args) {
|
@@ -256,7 +285,9 @@ export default class SelectorParser {
|
|
256
285
|
const nthOfIndex = args.indexOf(' of ');
|
257
286
|
const nthFunction = nthOfIndex !== -1 ? args.substring(0, nthOfIndex) : args;
|
258
287
|
const selectorItem =
|
259
|
-
nthOfIndex !== -1
|
288
|
+
nthOfIndex !== -1
|
289
|
+
? this.getSelectorItem(args.substring(nthOfIndex + 4).trim(), options)
|
290
|
+
: null;
|
260
291
|
return {
|
261
292
|
name: lowerName,
|
262
293
|
arguments: args,
|
@@ -275,12 +306,12 @@ export default class SelectorParser {
|
|
275
306
|
return {
|
276
307
|
name: lowerName,
|
277
308
|
arguments: args,
|
278
|
-
selectorItems: [this.getSelectorItem(args)],
|
309
|
+
selectorItems: [this.getSelectorItem(args, options)],
|
279
310
|
nthFunction: null
|
280
311
|
};
|
281
312
|
case 'is':
|
282
313
|
case 'where':
|
283
|
-
const selectorGroups = this.getSelectorGroups(args);
|
314
|
+
const selectorGroups = this.getSelectorGroups(args, options);
|
284
315
|
const selectorItems = [];
|
285
316
|
for (const group of selectorGroups) {
|
286
317
|
selectorItems.push(group[0]);
|