From 60858b671907c49c77afd520ecec43e15c5ee544 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 15 Apr 2019 18:56:28 -0400 Subject: [PATCH] Fix handling of backslashes in string expressions for `:has-text()` --- src/js/static-ext-filtering.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/js/static-ext-filtering.js b/src/js/static-ext-filtering.js index 7e0bef59c..e8c8a9535 100644 --- a/src/js/static-ext-filtering.js +++ b/src/js/static-ext-filtering.js @@ -173,14 +173,17 @@ ')\\(' ].join('')); - const reEscapeRegex = /[.*+?^${}()|[\]\\]/g, - reNeedScope = /^\s*[+>~]/, - reIsDanglingSelector = /(?:[+>~]\s*|\s+)$/; + const reEatBackslashes = /\\([()])/g; + const reEscapeRegex = /[.*+?^${}()|[\]\\]/g; + const reNeedScope = /^\s*[+>~]/; + const reIsDanglingSelector = /(?:[+>~]\s*|\s+)$/; const regexToRawValue = new Map(); let lastProceduralSelector = '', lastProceduralSelectorCompiled; + // When dealing with literal text, we must first eat _some_ + // backslash characters. const compileText = function(s) { const match = reParseRegexLiteral.exec(s); let regexDetails; @@ -191,7 +194,8 @@ regexDetails = [ regexDetails, match[2] ]; } } else { - regexDetails = s.replace(reEscapeRegex, '\\$&'); + regexDetails = s.replace(reEatBackslashes, '$1') + .replace(reEscapeRegex, '\\$&'); regexToRawValue.set(regexDetails, s); } return regexDetails;