Perf: don't run the regex replace unless the selectorText contains a colon (#1280)
* Perf: don't run the regex replace unless the selectorText contains a colon (rules generally contain colons) * Need to check type before querying selectorText property - also good as it means we only try to fix colons at the leaf level --------- Authored-by: eoghan murray <eoghan@getthere.ie>
This commit is contained in:
@@ -119,26 +119,29 @@ export function stringifyRule(rule: CSSRule): string {
|
||||
} catch (error) {
|
||||
// ignore
|
||||
}
|
||||
} else if (isCSSStyleRule(rule) && rule.selectorText.includes(':')) {
|
||||
// Safari does not escape selectors with : properly
|
||||
// see https://bugs.webkit.org/show_bug.cgi?id=184604
|
||||
return fixSafariColons(rule.cssText);
|
||||
}
|
||||
|
||||
return validateStringifiedCssRule(importStringified || rule.cssText);
|
||||
return importStringified || rule.cssText;
|
||||
}
|
||||
|
||||
export function validateStringifiedCssRule(cssStringified: string): string {
|
||||
// Safari does not escape selectors with : properly
|
||||
if (cssStringified.includes(':')) {
|
||||
// Replace e.g. [aa:bb] with [aa\\:bb]
|
||||
const regex = /(\[(?:[\w-]+)[^\\])(:(?:[\w-]+)\])/gm;
|
||||
return cssStringified.replace(regex, '$1\\$2');
|
||||
}
|
||||
|
||||
return cssStringified;
|
||||
export function fixSafariColons(cssStringified: string): string {
|
||||
// Replace e.g. [aa:bb] with [aa\\:bb]
|
||||
const regex = /(\[(?:[\w-]+)[^\\])(:(?:[\w-]+)\])/gm;
|
||||
return cssStringified.replace(regex, '$1\\$2');
|
||||
}
|
||||
|
||||
export function isCSSImportRule(rule: CSSRule): rule is CSSImportRule {
|
||||
return 'styleSheet' in rule;
|
||||
}
|
||||
|
||||
export function isCSSStyleRule(rule: CSSRule): rule is CSSStyleRule {
|
||||
return 'selectorText' in rule;
|
||||
}
|
||||
|
||||
export class Mirror implements IMirror<Node> {
|
||||
private idNodeMap: idNodeMap = new Map();
|
||||
private nodeMetaMap: nodeMetaMap = new WeakMap();
|
||||
|
||||
Reference in New Issue
Block a user