HTML `pattern` attribute should set `u` flag for regular expressions
https://bugs.webkit.org/show_bug.cgi?id=151598
Reviewed by Chris Dumez.
Source/JavaScriptCore:
Add UnicodeMode for JSC::Yarr::RegularExpression.
* yarr/RegularExpression.cpp:
(JSC::Yarr::RegularExpression::Private::create):
(JSC::Yarr::RegularExpression::Private::Private):
(JSC::Yarr::RegularExpression::Private::compile):
(JSC::Yarr::RegularExpression::RegularExpression):
* yarr/RegularExpression.h:
Source/WebCore:
This patch attaches "u" flag to the RegExp compiled for HTML "pattern" attribute[1].
[1]: https://html.spec.whatwg.org/multipage/forms.html#the-pattern-attribute
* html/BaseTextInputType.cpp:
(WebCore::BaseTextInputType::patternMismatch const):
LayoutTests:
* fast/forms/ValidityState-patternMismatch-expected.txt:
* fast/forms/ValidityState-patternMismatch.html:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@229363 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/yarr/RegularExpression.cpp b/Source/JavaScriptCore/yarr/RegularExpression.cpp
index c2c0470..1dcede6 100644
--- a/Source/JavaScriptCore/yarr/RegularExpression.cpp
+++ b/Source/JavaScriptCore/yarr/RegularExpression.cpp
@@ -37,9 +37,9 @@
class RegularExpression::Private : public RefCounted<RegularExpression::Private> {
public:
- static Ref<Private> create(const String& pattern, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode)
+ static Ref<Private> create(const String& pattern, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode, UnicodeMode unicodeMode)
{
- return adoptRef(*new Private(pattern, caseSensitivity, multilineMode));
+ return adoptRef(*new Private(pattern, caseSensitivity, multilineMode, unicodeMode));
}
int lastMatchLength { -1 };
@@ -48,12 +48,12 @@
std::unique_ptr<JSC::Yarr::BytecodePattern> m_regExpByteCode;
private:
- Private(const String& pattern, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode)
- : m_regExpByteCode(compile(pattern, caseSensitivity, multilineMode))
+ Private(const String& pattern, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode, UnicodeMode unicodeMode)
+ : m_regExpByteCode(compile(pattern, caseSensitivity, multilineMode, unicodeMode))
{
}
- std::unique_ptr<JSC::Yarr::BytecodePattern> compile(const String& patternString, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode)
+ std::unique_ptr<JSC::Yarr::BytecodePattern> compile(const String& patternString, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode, UnicodeMode unicodeMode)
{
RegExpFlags flags = NoFlags;
@@ -63,6 +63,9 @@
if (multilineMode == MultilineEnabled)
flags = static_cast<RegExpFlags>(flags | FlagMultiline);
+ if (unicodeMode == UnicodeAwareMode)
+ flags = static_cast<RegExpFlags>(flags | FlagUnicode);
+
JSC::Yarr::YarrPattern pattern(patternString, flags, m_constructionErrorCode);
if (JSC::Yarr::hasError(m_constructionErrorCode)) {
LOG_ERROR("RegularExpression: YARR compile failed with '%s'", JSC::Yarr::errorMessage(m_constructionErrorCode));
@@ -78,8 +81,8 @@
JSC::Yarr::ErrorCode m_constructionErrorCode { Yarr::ErrorCode::NoError };
};
-RegularExpression::RegularExpression(const String& pattern, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode)
- : d(Private::create(pattern, caseSensitivity, multilineMode))
+RegularExpression::RegularExpression(const String& pattern, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode, UnicodeMode unicodeMode)
+ : d(Private::create(pattern, caseSensitivity, multilineMode, unicodeMode))
{
}